ZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvLmNsYXNzcGF0aCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS8ucHJvamVjdCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWVhMTguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmI1YzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNGcmkgSnVuIDA1IDE4OjQyOjE3IEVEVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZDhjNGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VzQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwuY29yZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvYWJvdXQuaHRtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzYjBmMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE1NGRkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLnB0cC5yZHQuc2VydmljZXMKLUJ1bmRsZS1WZW5kb3IuMCA9IGVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gUFRQIFNlcnZpY2VzIE1vZGVsIFBsdWctaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3BsdWdpbi54bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzM2IyMGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb3ZpZGVycyIgbmFtZT0iU2VydmljZSBQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL3Byb3ZpZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2aWNlcyIgbmFtZT0iU2VydmljZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZpY2VzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZpY2VDYXRlZ29yaWVzIiBuYW1lPSJTZXJ2aWNlIENhdGVnb3JpZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZpY2VDYXRlZ29yaWVzLmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NjaGVtYS9wcm92aWRlcnMuZXhzZCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc2NoZW1hL3Byb3ZpZGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjUwZTJmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc2NoZW1hL3Byb3ZpZGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlIiBpZD0icHJvdmlkZXJzIiBuYW1lPSJTZXJ2aWNlIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gc3BlY2lmeSBhbHRlcm5hdGUgcHJvdmlkZXJzIGZvciBzZXJ2aWNlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmljZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgc2VydmljZSB0aGlzIHByb3ZpZGVyIGlzIGZvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBwcmlvcml0eSBmb3IgdGhlIHByb3ZpZGVyIC0gbG93ZXIgdmFsdWVzIGluZGljYXRlZCBhIGhpZ2hlciBwcmlvcml0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc2NoZW1hL3NlcnZpY2VDYXRlZ29yaWVzLmV4c2QgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NjaGVtYS9zZXJ2aWNlQ2F0ZWdvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ1YjA5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc2NoZW1hL3NlcnZpY2VDYXRlZ29yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUiIGlkPSJzZXJ2aWNlQ2F0ZWdvcmllcyIgbmFtZT0iU2VydmljZSBDYXRlZ29yaWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc2NoZW1hL3NlcnZpY2VzLmV4c2QgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NjaGVtYS9zZXJ2aWNlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDM5ZGVkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc2NoZW1hL3NlcnZpY2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUiIGlkPSJzZXJ2aWNlcyIgbmFtZT0iU2VydmljZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVXNlZCB0byBkZWZpbmUgYSBzZXJ2aWNlLiBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlbmRlZCB0byBhbGxvdyBjZXJ0YWluIHNlcnZpY2VzIHRvIGJlIGFic3RyYWN0ZWQuIEZvciBleGFtcGxlLCB0byBwcm92aWRlIHJlbW90ZSBpbXBsZW1lbnRhdGlvbnMgb2YgcHJvamVjdCBidWlsZCBzZXJ2aWNlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcnZpY2UiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VydmljZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5hdHVyZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBzZXJ2aWNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBwcmlvcml0eSBmb3IgdGhlIHNlcnZpY2UgLSBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHByaW9yaXR5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5SWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSUQgb2YgdGhlIHNlcnZpY2VDYXRlZ29yeSB0aGF0IHRoZSBzZXJ2aWNlIHNob3VsZCBiZWxvbmcgdG8uIE9wdGlvbmFsLCBpZiBub3Qgc3BlY2lmaWVkIHRoZSBzZXJ2aWNlIHdpbGwgZmFsbCBpbnRvIHRoZSAmcXVvdDtBZGRpdGlvbmFsIFNlcnZpY2VzJnF1b3Q7IGNhdGVnb3J5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im51bGxQcm92aWRlckNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBudWxsIHNlcnZpY2UgcHJvdmlkZXIgZm9yIHRoaXMgc2VydmljZS4gQSBzZXJ2aWNlIG1heSBoYXZlIGEgbnVsbCBwcm92aWRlciB0aGF0IGFjdHMgYXMgYSAmcXVvdDtuby1vcCZxdW90OyBwcm92aWRlciBhbmQgd2lsbCBiZSByZXR1cm5lZCBieSBJU2VydmljZUNvbmZpZ3VyYXRpb24uZ2V0U2VydmljZVByb3ZpZGVyKCkgd2hlbiBhIHNlcnZpY2UgaXMgZGlzYWJsZWQsIGlmIHRoZXJlIGlzIG5vIG51bGwgcHJvdmlkZXIgdGhlbiBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5hdHVyZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgbmF0dXJlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvSVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMTA1MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhcmJpdHJhcnkgc2VydmljZXMuICBTZXJ2aWNlcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgb25lIG9yIG1vcmUKLSAqIHByb3ZpZGVycy4gCi0gKgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG9yCi0gKiB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcKLSAqIHdpdGggdGhlIFJEVCB0ZWFtLgotICoKLSAqIEBzZWUgSVNlcnZpY2VQcm92aWRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIElEIG9mIHRoaXMgc2VydmljZSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIElEIG9mIHRoaXMgc2VydmljZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gbmFtZSBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHNldCBvZiBuYXR1cmVzIHRoYXQgdGhpcyBzZXJ2aWNlIGFwcGxpZXMgdG8uIFRoZQotCSAqIGRlZmF1bHQgbmF0dXJlICJhbGwiIG1lYW5zIHRoZSBzZXJ2aWNlcyBpcyBnZW5lcmljIGFuIGFwcGxpZXMKLQkgKiB0byBhbGwgbmF0dXJlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHNldCBvZiBuYXR1cmVzCi0JICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldE5hdHVyZXMoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHByaW9yaXR5IG9mIHRoaXMgc2VydmljZS4gTG93ZXIgdmFsdWVzIGhhdmUgaGlnaGVyIHByaW9yaXR5LgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZXJ2aWNlIHByaW9yaXR5Ci0JICovCi0JcHVibGljIEludGVnZXIgZ2V0UHJpb3JpdHkoKTsKLQkKLQkvKioKLQkgKiBHZXRzIGEgc3BlY2lmaWMgcHJvdmlkZXIgb2YgdGhpcyBzZXJ2aWNlLgotCSAqIAotCSAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIElEIG9mIHRoZSBzZXJ2aWNlIHJlcXVlc3RlZC4KLQkgKiBAcmV0dXJuIElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yCi0JICovCi0JcHVibGljIElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGdldFByb3ZpZGVyRGVzY3JpcHRvcihTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzZXQgb2YgYWxsIHByb3ZpZGVycyBmb3IgdGhpcyBzZXJ2aWNlLgotCSAqIAotCSAqIEByZXR1cm4gc2V0IG9mIHByb3ZpZGVycyBmb3IgdGhpcyBzZXJ2aWNlCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4gZ2V0UHJvdmlkZXJzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2YgcHJvdmlkZXJzIHNvcnRlZCBieSBwcmlvcml0eQotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UgY29udGFpbmluZyBwcm92aWRlcnMKLQkgKiBAcmV0dXJuIHNvcnRlZCBwcm92aWRlcnMKLQkgKi8KLQlwdWJsaWMgU29ydGVkU2V0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPiBnZXRQcm92aWRlcnNCeVByaW9yaXR5KCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHNlcnZpY2UgcHJvdmlkZXIgZnJvbSBsaXN0IG9mIHByb3ZpZGVycyBmb3IgdGhpcyBzZXJ2aWNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlciBwcm92aWRlciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXIpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZpY2UgY2F0ZWdvcnkgdGhhdCBjb250YWlucyB0aGlzIHNlcnZpY2Ugb3IKLQkgKiBudWxsIGlmIHRoZSBzZXJ2aWNlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VDYXRlZ29yeSBnZXRDYXRlZ29yeSgpOwotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpYWwgbnVsbCAibm8tb3AiIHNlcnZpY2UgcHJvdmlkZXIsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VQcm92aWRlciBnZXROdWxsUHJvdmlkZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlQ2F0ZWdvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhYjg0YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogU2VydmljZXMgY2FuIGJlIG9yZ2FuaXplZCBpbnRvIGNhdGVnb3JpZXMuIAotICogVGhpcyBpcyBtYWlubHkgc28gdGhhdCBzZXJ2aWNlcyBjYW4gYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyCi0gKiBpbiBhbiBvcmdhbml6ZWQgd2F5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlQ2F0ZWdvcnkgewotCQotCQotCS8qKgotCSAqIEdldCB0aGUgSUQgb2YgdGhlIHNlcnZpY2UgY2F0ZWdvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGlzIHNlcnZpY2UgY2F0ZWdvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogR2V0IGEgc2V0IG9mIGFsbCB0aGUgc2VydmljZXMgaW4gdGhlIGNhdGVnb3J5LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU2V0PElTZXJ2aWNlPiBnZXRTZXJ2aWNlcygpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvSVNlcnZpY2VDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmZjM2MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi0vKioKLSAqIEFuIElTZXJ2aWNlQ29uZmlndXJhdGlvbiByZXByZXNlbnRzIGEgcGFydGljdWxhciBzZXQgb2Ygc2VydmljZSBwcm92aWRlcnMKLSAqIGZvciBlYWNoIGtub3duIHNlcnZpY2UuIAotICogCi0gKiBBbiBJU2VydmljZUNvbmZpZ3VyYXRpb24gcmVwcmVzZW50cyBhIG1hcHBpbmcgZnJvbSBJU2VydmljZSB0byBJU2VydmljZVByb3ZpZGVyLgotICogSWYgdGhlcmUgZXhpc3RzIGEgbWFwcGluZyBmb3IgYSBwYXJ0aWN1bGFyIElTZXJ2aWNlIHRoZW4gdGhhdCBzZXJ2aWNlIGlzCi0gKiBjb25zaWRlcmVkICJlbmFibGVkIi4gSWYgdGhlcmUgaXMgbm8gbWFwcGluZyBmb3IgYSBzZXJ2aWNlIHRoZW4gdGhlIHNlcnZpY2UgCi0gKiBpcyBjb25zaWRlcmVkICJkaXNhYmxlZCIgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBEaXNhYmxpbmcgYSBzZXJ2aWNlIHJlbW92ZXMgCi0gKiB0aGUgc2VydmljZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgotICogCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgb3IKLSAqIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZwotICogd2l0aCB0aGUgUkRUIHRlYW0uCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmljZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkvKioKLQkgKiBHZXQgdGhlIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBJRCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc2VydmljZSBwcm92aWRlciBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIElmIHRoZSBzZXJ2aWNlIGlzIGRpc2FibGVkIGFuZCB0aGUgc2VydmljZSBoYXMgYSBudWxsLXByb3ZpZGVyCi0JICogdGhlbiB0aGUgbnVsbC1wcm92aWRlciB3aWxsIGJlIHJldHVybmVkLCBpZiB0aGUgc2VydmljZSBkb2VzIG5vdAotCSAqIGhhdmUgYSBudWxsLXByb3ZpZGVyIHRoZW4gbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UgZm9yIHdoaWNoIHByb3ZpZGVyIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBzZXJ2aWNlIHByb3ZpZGVyIGZvciB0aGUgc2VydmljZQotCSAqLwotCXB1YmxpYyBJU2VydmljZVByb3ZpZGVyIGdldFNlcnZpY2VQcm92aWRlcihJU2VydmljZSBzZXJ2aWNlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBvZiB0aGUgc2VydmljZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBhbGwgb2YgdGhlIHNlcnZpY2VzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBTZXQ8SVNlcnZpY2U+IGdldFNlcnZpY2VzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2Ygc2VydmljZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBzb3J0ZWQgYnkgcHJpb3JpdHkuCi0JICogCi0JICogQHBhcmFtIHNlcnZpY2Ugc2VydmljZSBjb250YWluaW5nIHByb3ZpZGVycwotCSAqIEByZXR1cm4gc29ydGVkIHByb3ZpZGVycwotCSAqLwotCXB1YmxpYyBTb3J0ZWRTZXQ8SVNlcnZpY2U+IGdldFNlcnZpY2VzQnlQcmlvcml0eSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoaXMgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQotCS8qKgotCSAqIFNldCB0aGUgc2VydmljZSBwcm92aWRlciBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIElmIHRoZSBzZXJ2aWNlIHdhcyBmb3JtZXJseSBkaXNhYmxlZCBpdCBiZWNvbWVzIGVuYWJsZWQuCi0JICogCi0JICogSWYgdGhlIHNlcnZpY2UgYWxyZWFkeSBoYXMgYSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggaXQgaXQgd2lsbCBiZSByZXBsYWNlZAotCSAqIHdpdGggdGhlIGdpdmVuIHByb3ZpZGVyLCB0aGUgb2xkIHByb3ZpZGVyIHdpbGwgYmUgcmVtZW1iZXJlZCBhbmQgd2lsbCBiZQotCSAqIHJldHVybmVkIGZyb20gZ2V0Rm9ybWVyU2VydmljZVBSb3ZpZGVycygpLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UgdG8gc2V0IHRoZSBwcm92aWRlciBmb3IKLQkgKiBAcGFyYW0gcHJvdmlkZXIgcHJvdmlkZXIgZm9yIHRoaXMgc2VydmljZQotCSAqIAotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc2VydmljZSBvciBwcm92aWRlciBpcyBudWxsCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2Ugc2VydmljZSwgSVNlcnZpY2VQcm92aWRlciBwcm92aWRlcik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIG9mIHRoZSBnaXZlbiBzZXJ2aWNlIGlzIG5vdCBwYXJ0IG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiBFcXVpdmFsZW50IHRvOgotCSAqIHtAY29kZSAhZ2V0U2VydmljZXMoKS5jb250YWlucyhzZXJ2aWNlKX0KLQkgKiAKLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIHRoZW4ge0Bjb2RlIGdldFNlcnZpY2VQcm92aWRlcigpfQotCSAqIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZWQoSVNlcnZpY2Ugc2VydmljZSk7Ci0JCi0JLyoqCi0JICogRGlzYWJsZXMgKHJlbW92ZXMpIHRoZSBzZXJ2aWNlIHByb3ZpZGVyIGZyb20gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2FibGUoSVNlcnZpY2Ugc2VydmljZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZU1vZGVsRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlTW9kZWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQyYzUwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJU2VydmljZU1vZGVsRXZlbnQgewotCS8qKgotCSAqIEV2ZW50IHR5cGUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IHNlcnZpY2UgY29uZmlndXJhdGlvbiBoYXMKLQkgKiBiZWVuIGFkZGVkIHRvIHRoZSBtb2RlbC4gRm9yIHRoaXMgZXZlbnQgdHlwZSwge0BsaW5rICNnZXRTb3VyY2UoKX0KLQkgKiB3aWxsIHJldHVybiB0aGUgbmV3IHNlcnZpY2UgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NPTkZJR1VSQVRJT05fQURERUQgPSAJCTB4MDAxOwotCi0JLyoqCi0JICogRXZlbnQgdHlwZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgc2VydmljZSBjb25maWd1cmF0aW9uIGhhcwotCSAqIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbC4gRm9yIHRoaXMgZXZlbnQgdHlwZSwge0BsaW5rICNnZXRTb3VyY2UoKX0KLQkgKiB3aWxsIHJldHVybiB0aGUgb2xkIHNlcnZpY2UgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NPTkZJR1VSQVRJT05fUkVNT1ZFRCA9IAkweDAwMjsKLQotCS8qKgotCSAqIEV2ZW50IHR5cGUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgc2VydmljZSBjb25maWd1cmF0aW9uIGhhcwotCSAqIGJlZW4gbW9kaWZpZWQuIEZvciB0aGlzIGV2ZW50IHR5cGUsIHtAbGluayAjZ2V0U291cmNlKCl9Ci0JICogd2lsbCByZXR1cm4gdGhlIG1vZGlmaWVkIHNlcnZpY2UgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCA9IAkweDAwNDsKLQkKLQkvKioKLQkgKiBFdmVudCB0eXBlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHNlcnZpY2UgY29uZmlndXJhdGlvbiBoYXMKLQkgKiBiZWVuIHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0LiBGb3IgdGhpcyBldmVudCB0eXBlLCB7QGxpbmsgI2dldFNvdXJjZSgpfQotCSAqIHdpbGwgcmV0dXJuIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24sIG9yIG51bGwgaWYgYWxsIHNlcnZpY2UKLQkgKiBjb25maWd1cmF0aW9ucyBhcmUgdW5zZWxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NPTkZJR1VSQVRJT05fU0VMRUNURUQgPSAJMHgwMDg7Ci0JCi0JLyoqCi0JICogRXZlbnQgdHlwZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHNlcnZpY2UgbW9kZWwgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5Ci0JICogc2F2ZWQgdG8gcGVyc2lzdGVudCBzdG9yYWdlLiBGb3IgdGhpcyBldmVudCB0eXBlLCB7QGxpbmsgI2dldFNvdXJjZSgpfQotCSAqIHdpbGwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIElTZXJ2aWNlTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTU9ERUxfU0FWRUQgPSAJCQkJMHgwMTA7Ci0JCi0JLyoqCi0JICogRXZlbnQgdHlwZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHNlcnZpY2UgbW9kZWwgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IAotCSAqIGxvYWRlZCBmcm9tIHBlcnNpc3RlbnQgc3RvcmFnZS4gRm9yIHRoaXMgZXZlbnQgdHlwZSwge0BsaW5rICNnZXRTb3VyY2UoKX0KLQkgKiB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZiBJU2VydmljZU1vZGVsTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01PREVMX0xPQURFRCA9IAkJCQkweDAyMDsKLQotCS8qKgotCSAqIEV2ZW50IHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vdGlmaWNhdGlvbiBvZiBhbGwKLQkgKiB0eXBlcyBvZiBldmVudHMgaXMgcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9FVkVOVFMgPSAJCQkJCQkweDAzZjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IGlkZW50aWZ5aW5nIHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIG9iamVjdCBpZGVudGlmeWluZyB0aGUgc291cmNlIG9mIHRoaXMgZXZlbnQgCi0JICogQHNlZSBqYXZhLnV0aWwuRXZlbnRPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpOwotCQotCS8qKgotCSAqIEZvciBldmVudHMgb2YgdHlwZSBTRVJWSUNFX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCB0aGlzIHdpbGwgcmV0dXJuCi0JICogdGhlIHNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2UgdGhhdCB3YXMgcmVwbGFjZWQgb3IgcmVtb3ZlZC4KLQkgKiBAc2VlIElTZXJ2aWNlTW9kZWxFdmVudCNTRVJWSUNFX0NPTkZJR1VSQVRJT05fQ0hBTkdFRAotCSAqLwotCXB1YmxpYyBJU2VydmljZVByb3ZpZGVyIGdldE9sZFByb3ZpZGVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiBldmVudCBiZWluZyByZXBvcnRlZC4KLQkgKgotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBldmVudCB0eXBlIGNvbnN0YW50cwotCSAqIEBzZWUgI1NFUlZJQ0VfQ09ORklHVVJBVElPTl9BRERFRAotCSAqIEBzZWUgI1NFUlZJQ0VfQ09ORklHVVJBVElPTl9SRU1PVkVECi0JICogQHNlZSAjU0VSVklDRV9DT05GSUdVUkFUSU9OX0NIQU5HRUQKLQkgKiBAc2VlICNTRVJWSUNFX0NPTkZJR1VSQVRJT05fU0VMRUNURUQKLQkgKiBAc2VlICNTRVJWSUNFX01PREVMX1NBVkVECi0JICogQHNlZSAjU0VSVklDRV9NT0RFTF9MT0FERUQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlTW9kZWxFdmVudExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDQ2NWU3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlTW9kZWxFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTsKLQotLyoqCi0gKiBBIHNlcnZpY2UgbW9kZWwgZXZlbnQgbGlzdGVuZXIgaXMgbm90aWZpZWQgb2YgZXZlbnRzIHJlbGF0aW5nIHRvIHRoZSBzZXJ2aWNlIG1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlTW9kZWxFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBzb21lIHNlcnZpY2UgbW9kZWwgZXZlbnQgaGFzIG9jY3VycmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgc2VydmljZSBtb2RlbCBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElTZXJ2aWNlTW9kZWxFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZU1vZGVsTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvSVNlcnZpY2VNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOWQ4Yy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZU1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlTW9kZWxNYW5hZ2VyIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogQXNzb2NpYXRlIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gd2l0aCBhIHByb2plY3QuIEEgcHJvamVjdCBjYW4gaGF2ZSBtdWx0aXBsZQotCSAqIHNlcnZpY2UgY29uZmlndXJhdGlvbnMuIFRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZWNvbWUgdGhlIGFjdGl2ZQotCSAqIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbmYgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByb2plY3Qgb3IgY29uZiBpcyBudWxsCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZik7Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gc2VydmljZSBjb25maWd1cmF0aW9uIHRvIHRoZSBtb2RlbCB3aXRob3V0IGV4cGxpY2l0bHkKLQkgKiBhc3NvY2lhdGluZyBpdCB3aXRoIGEgcGFydGljdWxhciBwcm9qZWN0LiBJdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdAotCSAqIGxhdGVyIHVzaW5nIHRoZSBhZGRDb25maWd1cmF0aW9uKElQcm9qZWN0LCBJU2VydmljZUNvbmZpZ3VyYXRpb24pIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAotCSAqIEBwYXJhbSBjb25mIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBjb25mIGlzIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25mKTsKLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3Igc2VydmljZSBtb2RlbCBldmVudHMuIEhhcyBubyBlZmZlY3QgaWYgYW4gCi0JICogaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gCi0JICogPHA+Ci0JICogTGlzdGVuZXJzIGNhbiBsaXN0ZW4gZm9yIHNldmVyYWwgdHlwZXMgb2YgZXZlbnQgYXMgZGVmaW5lZCBpbgotCSAqIDxjb2RlPklTZXJ2aWNlTW9kZWxFdmVudDwvY29kZT4uIENsaWVudHMgYXJlIGZyZWUgdG8gcmVnaXN0ZXIgZm9yCi0JICogYW55IG51bWJlciBvZiBldmVudCB0eXBlcy4gQ2xpZW50cyBhcmUgZ3VhcmFudGVlZCB0byBvbmx5IHJlY2VpdmUKLQkgKiBldmVudCB0eXBlcyBmb3Igd2hpY2ggdGhleSBhcmUgcmVnaXN0ZXJlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBwYXJhbSBldmVudE1hc2sgdGhlIGJpdC13aXNlIE9SIG9mIGFsbCBldmVudCB0eXBlcyBvZiBpbnRlcmVzdCB0byB0aGUKLQkgKiBsaXN0ZW5lcgotCSAqIEBzZWUgSVNlcnZpY2VNb2RlbEV2ZW50TGlzdGVuZXIKLQkgKiBAc2VlIElTZXJ2aWNlTW9kZWxFdmVudAotCSAqIEBzZWUgI3JlbW92ZUV2ZW50TGlzdGVuZXIoSVNlcnZpY2VNb2RlbEV2ZW50TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXZlbnRMaXN0ZW5lcihJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwgaW50IHR5cGUpOwotCQotCS8qKgotCSAqIEdldCB0aGUgZ2xvYmFsICJhY3RpdmUiIHNlcnZpY2UgY29uZmlndXJhdGlvbi4gVGhlICJhY3RpdmUiIGNvbmZpZ3VyYXRpb24gaXMgYW4KLQkgKiBhcmJpdHJhcnkgY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCBieSB0b29scyB0aGF0IGRvIG5vdCBvcGVyYXRlIG9uIGEgcHJvamVjdCBiYXNpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFjdGl2ZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24sIG9yIG51bGwgaWYgbm8gYWN0aXZlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc2V0Ci0JICovCi0JcHVibGljIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBnZXRBY3RpdmVDb25maWd1cmF0aW9uKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjb25maWd1cmF0aW9uIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZSBmb3IgdGhlIHByb2plY3QuIEVhY2ggcHJvamVjdCBoYXMKLQkgKiBleGFjdGx5IG9uZSBhY3RpdmUgY29uZmlndXJhdGlvbiwgd2hpY2ggZGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gc2VydmljZXMgdG8KLQkgKiBzZXJ2aWNlIHByb3ZpZGVycy4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gY3JlYXRlZCBmb3IgYSBwcm9qZWN0IHdpbGwgCi0JICogYmUgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uIGZvciB0aGF0IHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvYnRhaW5lZAotCSAqIEByZXR1cm4gdGhlIHNlcnZpY2UgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBwcm9qZWN0Ci0JICogCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwcm9qZWN0IGlzIG51bGwKLQkgKiBAdGhyb3dzIFByb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uIGlmIHRoZSBwcm9qZWN0IGhhcyBub3QgYmVlbiBjb25maWd1cmVkCi0JICovCi0JcHVibGljIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBnZXRBY3RpdmVDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QpOwotCQotCS8qKgotCSAqIEdldCB0aGUgbmFtZWQgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3QgZm9yIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgb2J0YWluZWQKLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIG9yIG51bGwgaWYgbm8gY29uZmlndXJhdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgbmFtZSBleGlzdAotCSAqIAotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcHJvamVjdCBpcyBudWxsCi0JICogQHRocm93cyBQcm9qZWN0Tm90Q29uZmlndXJlZEV4Y2VwdGlvbiBpZiB0aGUgcHJvamVjdCBoYXMgbm90IGJlZW4gY29uZmlndXJlZAotCSAqLwotCXB1YmxpYyBJU2VydmljZUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjb25maWd1cmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gb3IgbnVsbCBpZiBubyBjb25maWd1cmF0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCBJRCBleGlzdAotCSAqLwotCXB1YmxpYyBJU2VydmljZUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihTdHJpbmcgaWQpOwotCQotCS8qKgotCSAqIEdldCBhbGwgY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHJldHVybiBhbGwgY29uZmlndXJhdGlvbnMgdGhhdCBjb3VsZCBiZSBmb3VuZCwgb3IgYW4gZW1wdHkgc2V0Ci0JICovCi0JcHVibGljIFNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCi0JLyoqCi0JICogR2V0IGFsbCB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUga25vd24gYnkgdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGNvbmZpZ3VyYXRpb25zCi0JICogQHJldHVybiBzZXQgb2YgY29uZmlndXJhdGlvbnMga25vd24gYnkgdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByb2plY3QgaXMgbnVsbAotCSAqIEB0aHJvd3MgUHJvamVjdE5vdENvbmZpZ3VyZWRFeGNlcHRpb24gaWYgdGhlIHByb2plY3QgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQKLQkgKi8KLQlwdWJsaWMgU2V0PElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gZ2V0Q29uZmlndXJhdGlvbnMoSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzZXQgb2YgcHJvamVjdHMgd2hpY2ggdXNlIHRoZSBzcGVjaWZpZWQgc2VydmljZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIHNlcnZpY2VDb25maWd1cmF0aW9uIFNlcnZpY2UgY29uZmlndXJhdGlvbiB0byBxdWVyeSBzZXQgb2YgcHJvamVjdHMgdXNpbmcgaXQKLQkgKiBAcmV0dXJuIFNldCBvZiBwcm9qZWN0cyB1c2luZyB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFNldDxJUHJvamVjdD4gZ2V0UHJvamVjdHNGb3JDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBzZXJ2aWNlQ29uZmlndXJhdGlvbik7Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBzZXJ2aWNlIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgc2VydmljZSB0byByZXRyaWV2ZS4KLQkgKiBAcmV0dXJuIElTZXJ2aWNlIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2UgZ2V0U2VydmljZShTdHJpbmcgaWQpOwotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBhIHNlcnZpY2UgcHJvdmlkZXIgYmFzZWQgb24gdGhlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGRlc2MgZXh0ZW5zaW9uIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiBzZXJ2aWNlIHByb3ZpZGVyCi0JICovCi0JcHVibGljIElTZXJ2aWNlUHJvdmlkZXIgZ2V0U2VydmljZVByb3ZpZGVyKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2MpOwotCQotCS8qKgotCSAqIEdldCBhbGwgdGhlIHNlcnZpY2VzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3lzdGVtLgotCSAqIAotCSAqIEByZXR1cm4gYSBzZXQgb2YgYWxsIHRoZSBzZXJ2aWNlcwotCSAqLwotCXB1YmxpYyBTZXQ8SVNlcnZpY2U+IGdldFNlcnZpY2VzKCk7Ci0JCi0JLyoqCi0JICogR2V0IGFsbCB0aGUgc2VydmljZXMgdGhhdCBhcmUgdXNlZCBieSBhIHBhcnRpY3VsYXIgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHVzaW5nIHRoZSBzZXJ2aWNlcwotCSAqIEByZXR1cm4gc2V0IG9mIHNlcnZpY2VzCi0JICogCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwcm9qZWN0IGlzIG51bGwKLQkgKiBAdGhyb3dzIFByb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uIGlmIHRoZSBwcm9qZWN0IGhhcyBub3QgYmVlbiBjb25maWd1cmVkCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZT4gZ2V0U2VydmljZXMoSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JLyoqCi0JICogR2V0IGFsbCB0aGUgc2VydmljZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdCBuYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZSBwcm9qZWN0IG5hdHVyZQotCSAqIEByZXR1cm4gc2V0IG9mIHNlcnZpY2VzIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgU2V0PElTZXJ2aWNlPiBnZXRTZXJ2aWNlcyhTdHJpbmcgbmF0dXJlSUQpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBzZXJ2aWNlIGNhdGVnb3JpZXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoCi0JICogdGhlIHN5c3RlbS4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZUNhdGVnb3J5PiBnZXRDYXRlZ29yaWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKElQcm9qZWN0IHByb2plY3QpOwotCQotCQotCS8qKgotCSAqIE9idGFpbiBhIG5ldyBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gd2l0aCBuYW1lICduYW1lJy4gVGhlIG5hbWUKLQkgKiBkb2VzIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhpcyBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gd2lsbCBub3QKLQkgKiBiZWNvbWUgcGFydCBvZiB0aGUgc2VydmljZSBtb2RlbCB1bnRpbCBpdCBpcyBwYXNzZWQgdG8gCi0JICogb25lIG9mIHRoZSBhZGRDb25maWd1cmF0aW9uKCkgbWV0aG9kcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHNlcnZpY2UgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gbmV3IHNlcnZpY2UgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU2VydmljZUNvbmZpZ3VyYXRpb24gbmV3U2VydmljZUNvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUpOwotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHRoZSBjb25maWd1cmF0aW9ucyBhbmQgc2VydmljZXMgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiBJZiB0aGUgcHJvamVjdCBoYXMgbm90IGJlZW4gY29uZmlndXJlZCB0aGVuIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLQkgKiAKLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHByb2plY3QgaXMgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHNlcnZpY2UgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZiB0aGUgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZik7Ci0KLQkvKioKLQkgKiBUT0RPIFdoYXQgaGFwcGVucyBpZiB5b3UgdHJ5IHRvIHJlbW92ZSB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24/Ci0JICogVE9ETyBXaGF0IGhhcHBlbnMgaWYgdGhlcmUgYXJlIG5vIGNvbmZpZ3VyYXRpb25zIGxlZnQgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24/Ci0JICogCi0JICogUmVtb3ZlIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZnJvbSBhIHByb2plY3QuCi0JICogSWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIG5vdCBzZXQgdXAgb24gdGhlIHByb2plY3QgdGhlbiB0aGlzIG1ldGhvZAotCSAqIGRvZXMgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAotCSAqIEBwYXJhbSBjb25mIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwcm9qZWN0IG9yIGNvbmYgaXMgbnVsbAotCSAqIEB0aHJvd3MgUHJvamVjdE5vdENvbmZpZ3VyZWRFeGNlcHRpb24gaWYgdGhlIHByb2plY3QgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25mKTsKLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3Igc2VydmljZSBtb2RlbCBldmVudHMuIEhhcyBubyBlZmZlY3QgaWYgdGhlIAotCSAqIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLiAKLQkgKiA8cD4KLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICogQHNlZSBJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcgotCSAqIEBzZWUgSVNlcnZpY2VNb2RlbEV2ZW50Ci0JICogQHNlZSAjYWRkRXZlbnRMaXN0ZW5lcihJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFdmVudExpc3RlbmVyKElTZXJ2aWNlTW9kZWxFdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uIGZvciBhIHByb2plY3QuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBjb25maWd1cmF0aW9uIGNyZWF0ZWQKLQkgKiBmb3IgYSBwcm9qZWN0IHdpbGwgYmUgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uIGZvciB0aGF0IHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvYnRhaW5lZAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gdG8gc2V0IGFzIGFjdGl2ZSBmb3IgdGhpcyBwcm9qZWN0Ci0JICogCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwcm9qZWN0IG9yIGNvbmZpZ3VyYXRpb24gaXMgbnVsbAotCSAqIEB0aHJvd3MgUHJvamVjdE5vdENvbmZpZ3VyZWRFeGNlcHRpb24gaWYgdGhlIHByb2plY3QgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQgeWV0Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIG5vdCBwYXJ0IG9mIHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlQ29uZmlndXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbik7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBnbG9iYWwgImFjdGl2ZSIgc2VydmljZSBjb25maWd1cmF0aW9uLiBUaGUgImFjdGl2ZSIgY29uZmlndXJhdGlvbiBpcyBhbgotCSAqIGFyYml0cmFyeSBjb25maWd1cmF0aW9uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzIHRoYXQgZG8gbm90IG9wZXJhdGUgb24gYSBwcm9qZWN0IGJhc2lzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgdGhlIHNlcnZpY2UgY29uZmlndXJhdGlvbiB0byBzZWxlY3QgYXMgYWN0aXZlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlQ29uZmlndXJhdGlvbihJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlUHJvdmlkZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwOGEwOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9JU2VydmljZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLQotLyoqCi0gKiBBbiBJU2VydmljZVByb3ZpZGVyIHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYW4gSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IsIAotICogYW5kIHRoZXJlIGNhbiBiZSBtYW55IGluc3RhbmNlcyBmb3IgZWFjaCBJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvci4gCi0gKiAKLSAqIElTZXJ2aWNlUHJvdmlkZXIgY29udGFpbnMgYXR0cmlidXRlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhcgotICogc2VydmljZSBwcm92aWRlci4KLSAqIAotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG9yCi0gKiB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcKLSAqIHdpdGggdGhlIFJEVCB0ZWFtLgotICoKLSAqIEBzZWUgSVNlcnZpY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmljZVByb3ZpZGVyIGV4dGVuZHMgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IsIElBZGFwdGFibGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYga2V5IG5vdCBzdG9yZWQKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvciBkZWZhdWx0VmFsdWUgaWYgbm8gdmFsdWUgd2FzIGZvdW5kCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHByb3ZpZGVyIHNwZWNpZmljIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gaW5mb3JtYXRpb24gb24gY3VycmVudCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHByb3ZpZGVyCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25TdHJpbmcoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiBzZXJ2aWNlIHByb3ZpZGVyIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGtleSBub3Qgc3RvcmVkCi0JICogQHJldHVybiB0aGUgdmFsdWUgb3IgZGVmYXVsdFZhbHVlIGlmIG5vIHZhbHVlIHdhcyBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBrZXksIGludCBkZWZhdWx0VmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBpZiBrZXkgbm90IHN0b3JlZAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9yIGRlZmF1bHRWYWx1ZSBpZiBubyB2YWx1ZSB3YXMgZm91bmQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKTsKLQkKLQkvKioKLQkgKiBUZXN0IGlmIHRoaXMgc2VydmljZSBwcm92aWRlciBoYXMgYmVlbiBjb25maWd1cmVkLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwcm92aWRlciBoYXMgYmVlbiBjb25maWd1cmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNldCBvZiBhbGwgdGhlIHByb3BlcnR5IGtleXMgdGhhdCBhcHBseSB0byB0aGlzCi0JICogc2VydmljZSBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBib29sZWFuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7Ci0JCi0JCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gaW50Ci0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgZGVzY3JpcHRvciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpOwotCQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL0lTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDVhOTEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlOwotCi0vKioKLSAqIEFuIElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIHJlcHJlc2VudHMgdGhlIGRlc2NyaXB0aW9uIChidXQgbm90IGFuCi0gKiBpbnN0YW5jZSBvZikgb2YgYSBzZXJ2aWNlIHByb3ZpZGVyLiBJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcnMgY29udGFpbgotICogdGhlIGltbXV0YWJsZSBpbmZvcm1hdGlvbiBhYm91dCBhIHNlcnZpY2UgcHJvdmlkZXIuCi0gKiAKLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBvcgotICogdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nCi0gKiB3aXRoIHRoZSBSRFQgdGVhbS4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgewotCS8qKgotCSAqIEdldCB0aGUgSUQgb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLCBvciBudWxsIGlmIHRoaXMgaXMgYSBudWxsIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gSUQgb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIsIG9yIG51bGwgaWYgdGhpcyBpcyBhIG51bGwgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBuYW1lIG9mIHRoaXMgc2VydmljZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBwcm92aWRlciBpcyBmb3IuCi0JICogCi0JICogQHJldHVybiBzZXJ2aWNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSWQoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHByaW9yaXR5IGZvciB0aGUgdGhlIHByb3ZpZGVyLiAKLQkgKiBMb3dlciB2YWx1ZXMgaGF2ZSBoaWdoZXIgcHJpb3JpdHkuCi0JICogCi0JICogQHJldHVybiBwcmlvcml0eQotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFByaW9yaXR5KCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9Qcm9qZWN0RGVsZXRpb25MaXN0ZW5lci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvUHJvamVjdERlbGV0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhZTM1YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9Qcm9qZWN0RGVsZXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLS8qKgotICogUmVtb3ZlcyBkZWxldGVkIHByb2plY3RzIGZyb20gdGhlIHNlcnZpY2UgbW9kZWwuCi0gKiAKLSAqIEBhdXRob3IgTWlrZSBLdWNlcmEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0RGVsZXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgUHJvamVjdERlbGV0aW9uTGlzdGVuZXIoKSB7fQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb2plY3REZWxldGlvbkxpc3RlbmVyIGluc3RhbmNlID0gbmV3IFByb2plY3REZWxldGlvbkxpc3RlbmVyKCk7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQkvLyBiZWZvcmUtdGhlLWZhY3QgcmVwb3J0IG9mIHBlbmRpbmcgZGVsZXRpb24gb2YgYSBzaW5nbGUgcHJvamVjdAotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpbnN0YW5jZSwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIFdpbGwgZ2V0IG5vdGlmaWVkIGFib3V0IHByb2plY3QgZGVsZXRpb24gYmVmb3JlIHRoZSBwcm9qZWN0IGlzIGFjdHVhbGx5Ci0JICogZGVsZXRlZCwgc2ltcGx5IHJlbW92ZSB0aGUgcHJvamVjdCBmcm9tIHRoZSBzZXJ2aWNlIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQlTZXJ2aWNlTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCQotCQkvLyBkb2VzIG5vdGhpbmcgaWYgdGhlIHByb2plY3QgaXMgbm90IHBhcnQgb2YgdGhlIHNlcnZpY2UgbW9kZWwKLQkJbWFuYWdlci5yZW1vdmUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQltYW5hZ2VyLnNhdmVNb2RlbENvbmZpZ3VyYXRpb24oKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU2VydmljZXNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL1Byb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9Qcm9qZWN0Tm90Q29uZmlndXJlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTNhZTU5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL1Byb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTsKLQotCi0vKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCBmb3Igc29tZSByZWFzb24gdGhlIGdpdmVuIHByb2plY3QncyBzZXJ2aWNlCi0gKiBtb2RlbCBoYXMgbm90IGJlZW4gY29uZmlndXJlZC4KLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBvcgotICogdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nCi0gKiB3aXRoIHRoZSBSRFQgdGVhbS4KLSAqCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotcHVibGljIGNsYXNzIFByb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgUHJvamVjdE5vdENvbmZpZ3VyZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFByb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdE5vdENvbmZpZ3VyZWRFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIFByb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvU2VydmljZU1vZGVsTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvU2VydmljZU1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjU1N2E0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL1NlcnZpY2VNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmUuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwuY29yZS5TZXJ2aWNlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmUuU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmUuU2VydmljZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmUuU2VydmljZU1vZGVsRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5pbnRlcm5hbC5jb3JlLlNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKLQotLyoqCi0gKiBBIHNpbmdsZXRvbiBjbGFzcyB3aGljaCBpcyB0aGUgZW50cnkgcG9pbnQgdG8gYSBzZXJ2aWNlIG1vZGVsIHdoaWNoIHJlcHJlc2VudHM6Ci0gKiAtIHRoZSBzZXQgb2YgY29udHJpYnV0ZWQgc2VydmljZXMKLSAqIC0gdGhlIHNldCBvZiBwcm92aWRlcnMgd2hpY2ggcHJvdmlkZSB0aG9zZSBzZXJ2aWNlcwotICogLSB0aGUgc2VydmljZSBmUHJvamVjdENvbmZpZ3VyYXRpb25zIGZvciBlYWNoIHByb2plY3Qgd2hpY2ggc3BlY2lmeSB3aGljaCBzZXJ2aWNlcyBhcmUKLSAqIAkJbWFwcGVkIHRvIHdoaWNoIHByb3ZpZGVycy4KLSAqCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgb3IKLSAqIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZwotICogd2l0aCB0aGUgUkRUIHRlYW0uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VNb2RlbE1hbmFnZXIgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdCBpbXBsZW1lbnRzIElTZXJ2aWNlTW9kZWxNYW5hZ2VyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9FWFRFTlNJT05fSUQgPSAic2VydmljZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1ZJREVSX0VYVEVOU0lPTl9JRCA9ICJwcm92aWRlcnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0VYVEVOU0lPTl9JRCA9ICJzZXJ2aWNlQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9FTEVNRU5UX05BTUUgPSAic2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFUVVJFX0VMRU1FTlRfTkFNRSA9ICJuYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1ZJREVSX0VMRU1FTlRfTkFNRSA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfRUxFTUVOVF9OQU1FID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBESVNBQkxFRF9QUk9WSURFUlNfRUxFTUVOVF9OQU1FID0gImRpc2FibGVkUHJvdmlkZXJzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9QUklPUklUWSA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9TRVJWSUNFX0lEID0gInNlcnZpY2VJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9DQVRFR09SWV9JRCA9ICJjYXRlZ29yeUlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05VTExfUFJPVklERVJfQ0xBU1MgPSAibnVsbFByb3ZpZGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfQUNUSVZFID0gImFjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9NT0RFTF9FTEVNRU5UX05BTUUgPSAic2VydmljZS1tb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9FTEVNRU5UX05BTUUgPSAicHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9DT05GSUdVUkFUSU9OX0VMRU1FTlRfTkFNRSA9ICJzZXJ2aWNlLWNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1ZJREVSX0NPTkZJR1VSQVRJT05fRUxFTUVOVF9OQU1FID0gInByb3ZpZGVyLWNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfUFJPVklERVJfSUQgPSAicHJvdmlkZXItaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfU0FWRV9GSUxFX05BTUUgPSAic2VydmljZV9tb2RlbC54bWwiOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCXByaXZhdGUgc3RhdGljIDxUPiBUIGdldENvbmYoTWFwPElQcm9qZWN0LCBUPiBtYXAsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlUIHZhbHVlID0gbWFwLmdldChwcm9qZWN0KTsKLQkJaWYodmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFByb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uKCk7IAotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9IAotCQotCS8qKgotCSAqIFNhdmUgdGhlIG1vZGVsIGNvbmZpZ3VyYXRpb24gdG8gcGVyc2lzdGVudCBzdG9yYWdlCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3MKLQkgKiBAcGFyYW0gcHJvamVjdENvbmZpZ3MKLQkgKiBAcGFyYW0gYWN0aXZlQ29uZmlncwotCSAqIEBwYXJhbSB3cml0ZXIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYXZlTW9kZWxDb25maWd1cmF0aW9uKE1hcDxTdHJpbmcsIElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gY29uZmlncywKLQkJCU1hcDxJUHJvamVjdCwgTWFwPFN0cmluZywgSVNlcnZpY2VDb25maWd1cmF0aW9uPj4gcHJvamVjdENvbmZpZ3MsCi0JCQlNYXA8SVByb2plY3QsIElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gYWN0aXZlQ29uZmlncywKLQkJCVdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlYTUxNZW1lbnRvIHJvb3RNZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoU0VSVklDRV9NT0RFTF9FTEVNRU5UX05BTUUpOwotCQkKLQkJZm9yIChJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnIDogY29uZmlncy52YWx1ZXMoKSkgewotCQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25JZCA9IGNvbmZpZy5nZXRJZCgpOwotCQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25OYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQkJCQotCQkJSU1lbWVudG8gY29uZmlnTWVtZW50byA9IHJvb3RNZW1lbnRvLmNyZWF0ZUNoaWxkKFNFUlZJQ0VfQ09ORklHVVJBVElPTl9FTEVNRU5UX05BTUUpOwotCQkJY29uZmlnTWVtZW50by5wdXRTdHJpbmcoQVRUUl9JRCwgY29uZmlndXJhdGlvbklkKTsKLQkJCWNvbmZpZ01lbWVudG8ucHV0U3RyaW5nKEFUVFJfTkFNRSwgY29uZmlndXJhdGlvbk5hbWUpOwotCQkJCi0JCQlTZXQ8SVNlcnZpY2U+IHNlcnZpY2VzID0gY29uZmlnLmdldFNlcnZpY2VzKCk7Ci0JCQlmb3IgKElTZXJ2aWNlIHNlcnZpY2UgOiBzZXJ2aWNlcykgewotCQkJCWlmKCFjb25maWcuaXNEaXNhYmxlZChzZXJ2aWNlKSkgewotCQkJCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gY29uZmlnLmdldFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlKTsKLQkJCQkJSU1lbWVudG8gc2VydmljZU1lbWVudG8gPSBjb25maWdNZW1lbnRvLmNyZWF0ZUNoaWxkKFNFUlZJQ0VfRUxFTUVOVF9OQU1FKTsKLQkJCQkJc2VydmljZU1lbWVudG8ucHV0U3RyaW5nKEFUVFJfSUQsIHNlcnZpY2UuZ2V0SWQoKSk7Ci0JCQkJCXNlcnZpY2VNZW1lbnRvLnB1dFN0cmluZyhBVFRSX1BST1ZJREVSX0lELCBwcm92aWRlci5nZXRJZCgpKTsKLQkJCQkJc2F2ZVByb3ZpZGVyU3RhdGUocHJvdmlkZXIsIHNlcnZpY2VNZW1lbnRvKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoY29uZmlnIGluc3RhbmNlb2YgU2VydmljZUNvbmZpZ3VyYXRpb24pIHsKLQkJCQkJU2V0PElTZXJ2aWNlUHJvdmlkZXI+IGRpc2FibGVkUHJvdmlkZXJzID0gKChTZXJ2aWNlQ29uZmlndXJhdGlvbiljb25maWcpLmdldEZvcm1lclNlcnZpY2VQcm92aWRlcnMoc2VydmljZSk7Ci0JCQkJCWlmKCFkaXNhYmxlZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCQkJCUlNZW1lbnRvIGRpc2FibGVkTWVtZW50byA9IGNvbmZpZ01lbWVudG8uY3JlYXRlQ2hpbGQoRElTQUJMRURfUFJPVklERVJTX0VMRU1FTlRfTkFNRSk7Ci0JCQkJCQlkaXNhYmxlZE1lbWVudG8ucHV0U3RyaW5nKEFUVFJfSUQsIHNlcnZpY2UuZ2V0SWQoKSk7Ci0JCQkJCQlmb3IoSVNlcnZpY2VQcm92aWRlciBkaXNhYmxlZFByb3ZpZGVyIDogZGlzYWJsZWRQcm92aWRlcnMpIHsKLQkJCQkJCQlJTWVtZW50byBwcm92aWRlck1lbWVudG8gPSBkaXNhYmxlZE1lbWVudG8uY3JlYXRlQ2hpbGQoUFJPVklERVJfRUxFTUVOVF9OQU1FKTsKLQkJCQkJCQlwcm92aWRlck1lbWVudG8ucHV0U3RyaW5nKEFUVFJfUFJPVklERVJfSUQsIGRpc2FibGVkUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQkJCQkJc2F2ZVByb3ZpZGVyU3RhdGUoZGlzYWJsZWRQcm92aWRlciwgcHJvdmlkZXJNZW1lbnRvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZm9yIChFbnRyeTxJUHJvamVjdCwgTWFwPFN0cmluZywgSVNlcnZpY2VDb25maWd1cmF0aW9uPj4gZW50cnkgOiBwcm9qZWN0Q29uZmlncy5lbnRyeVNldCgpKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsvLyBTa2lwIG92ZXIgZGVsZXRlZCBwcm9qZWN0cwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJCUlNZW1lbnRvIHByb2plY3RNZW1lbnRvID0gcm9vdE1lbWVudG8uY3JlYXRlQ2hpbGQoUFJPSkVDVF9FTEVNRU5UX05BTUUpOwotCQkJcHJvamVjdE1lbWVudG8ucHV0U3RyaW5nKEFUVFJfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkJCi0JCQlNYXA8U3RyaW5nLCBJU2VydmljZUNvbmZpZ3VyYXRpb24+IGNvbmZpZ3VyYXRpb25zID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWZvciAoSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZyA6IGNvbmZpZ3VyYXRpb25zLnZhbHVlcygpKSB7Ci0JCQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25JZCA9IGNvbmZpZy5nZXRJZCgpOwotCQkJCQotCQkJCUlNZW1lbnRvIGNvbmZpZ01lbWVudG8gPSBwcm9qZWN0TWVtZW50by5jcmVhdGVDaGlsZChTRVJWSUNFX0NPTkZJR1VSQVRJT05fRUxFTUVOVF9OQU1FKTsKLQkJCQljb25maWdNZW1lbnRvLnB1dFN0cmluZyhBVFRSX0lELCBjb25maWd1cmF0aW9uSWQpOwotCQkJCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBhY3RpdmUgPSBhY3RpdmVDb25maWdzLmdldChwcm9qZWN0KTsKLQkJCQljb25maWdNZW1lbnRvLnB1dEJvb2xlYW4oQVRUUl9BQ1RJVkUsIGFjdGl2ZSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCQkJCi0JCXJvb3RNZW1lbnRvLnNhdmUod3JpdGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgYSBzZXJ2aWNlIHByb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyCi0JICogQHBhcmFtIHBhcmVudE1lbWVudG8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNhdmVQcm92aWRlclN0YXRlKElTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIsIElNZW1lbnRvIHBhcmVudE1lbWVudG8pIHsKLQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgU2VydmljZVByb3ZpZGVyKSB7Ci0JCQlJTWVtZW50byBwcm92aWRlckNvbmZpZ01lbWVudG8gPSBwYXJlbnRNZW1lbnRvLmNyZWF0ZUNoaWxkKFBST1ZJREVSX0NPTkZJR1VSQVRJT05fRUxFTUVOVF9OQU1FKTsKLQkJCSgoU2VydmljZVByb3ZpZGVyKXByb3ZpZGVyKS5zYXZlU3RhdGUocHJvdmlkZXJDb25maWdNZW1lbnRvKTsKLQkJfQotCX0KLQkKLQkvKiogRGVmYXVsdCBsb2NhdGlvbiB0byBzYXZlIHNlcnZpY2UgbW9kZWwgY29uZmlndXJhdGlvbiAqLwotCXByaXZhdGUgZmluYWwgSVBhdGggZGVmYXVsdFNhdmVGaWxlOwotCXByaXZhdGUgTWFwPFN0cmluZywgSVNlcnZpY2VDb25maWd1cmF0aW9uPiBmQ29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElTZXJ2aWNlQ29uZmlndXJhdGlvbj4oKTsKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgTWFwPFN0cmluZywgSVNlcnZpY2VDb25maWd1cmF0aW9uPj4gZlByb2plY3RDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBNYXA8U3RyaW5nLCBJU2VydmljZUNvbmZpZ3VyYXRpb24+PigpOwotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBJU2VydmljZUNvbmZpZ3VyYXRpb24+IGZBY3RpdmVDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBJU2VydmljZUNvbmZpZ3VyYXRpb24+KCk7Ci0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIFNldDxJU2VydmljZT4+IGZQcm9qZWN0U2VydmljZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgU2V0PElTZXJ2aWNlPj4oKTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNlcnZpY2U+IGZTZXJ2aWNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLFNlcnZpY2VDYXRlZ29yeT4gZkNhdGVnb3JpZXM7Ci0JcHJpdmF0ZSBTZXQ8SVNlcnZpY2U+IGZTZXJ2aWNlU2V0ID0gbnVsbDsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJU2VydmljZT4+IGZOYXR1cmVTZXJ2aWNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBJU2VydmljZUNvbmZpZ3VyYXRpb24gZkRlZmF1bHRTZXJ2aWNlQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTZXJ2aWNlTW9kZWxFdmVudE1hbmFnZXIgZkV2ZW50TWFuYWdlciA9IG5ldyBTZXJ2aWNlTW9kZWxFdmVudE1hbmFnZXIoKTsKLQlwcml2YXRlIGJvb2xlYW4gZk1vZGVsTG9hZGVkID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZU1vZGVsTWFuYWdlciBmSW5zdGFuY2U7Ci0JCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2VydmljZU1vZGVsTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBTZXJ2aWNlTW9kZWxNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTZXJ2aWNlTW9kZWxNYW5hZ2VyKCkgewotCQlkZWZhdWx0U2F2ZUZpbGUgPSBTZXJ2aWNlc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoREVGQVVMVF9TQVZFX0ZJTEVfTkFNRSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjYWRkQ29uZmlndXJhdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmYpIHsKLQkJY2hlY2tBbmRMb2FkTW9kZWwoKTsKLQkJCi0JCWlmKHByb2plY3QgPT0gbnVsbCB8fCBjb25mID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCi0JCU1hcDxTdHJpbmcsIElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gY29uZnMgPSBmUHJvamVjdENvbmZpZ3VyYXRpb25zLmdldChwcm9qZWN0KTsKLQkJaWYoY29uZnMgPT0gbnVsbCkgewotCQkJY29uZnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElTZXJ2aWNlQ29uZmlndXJhdGlvbj4oKTsKLQkJCWZQcm9qZWN0Q29uZmlndXJhdGlvbnMucHV0KHByb2plY3QsIGNvbmZzKTsKLQkJCWZBY3RpdmVDb25maWd1cmF0aW9ucy5wdXQocHJvamVjdCwgY29uZik7Ci0JCX0KLQkJCi0JCWNvbmZzLnB1dChjb25mLmdldElkKCksIGNvbmYpOwotCQkKLQkJU2V0PElTZXJ2aWNlPiBzZXJ2aWNlcyA9IGZQcm9qZWN0U2VydmljZXMuZ2V0KHByb2plY3QpOwotCQlpZihzZXJ2aWNlcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlcyA9IG5ldyBIYXNoU2V0PElTZXJ2aWNlPigpOwotCQkJZlByb2plY3RTZXJ2aWNlcy5wdXQocHJvamVjdCwgc2VydmljZXMpOwotCQl9Ci0JCQotCQlmb3IoSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZyA6IGNvbmZzLnZhbHVlcygpKSB7Ci0JCQlmb3IoSVNlcnZpY2Ugc2VydmljZSA6IGNvbmZpZy5nZXRTZXJ2aWNlcygpKSB7Ci0JCQkJc2VydmljZXMuYWRkKHNlcnZpY2UpOwotCQkJfQotCQl9Ci0JCQotCQlhZGRDb25maWd1cmF0aW9uKGNvbmYpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlciNhZGRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25mKSB7Ci0JCWNoZWNrQW5kTG9hZE1vZGVsKCk7IAotCQlpZihmQ29uZmlndXJhdGlvbnMucHV0KGNvbmYuZ2V0SWQoKSwgY29uZikgPT0gbnVsbCkgewotCQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBTZXJ2aWNlTW9kZWxFdmVudChjb25mLCBJU2VydmljZU1vZGVsRXZlbnQuU0VSVklDRV9DT05GSUdVUkFUSU9OX0FEREVEKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjYWRkRXZlbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV2ZW50TGlzdGVuZXIoSVNlcnZpY2VNb2RlbEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIsIGludCB0eXBlKSB7Ci0JCWZFdmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihsaXN0ZW5lciwgdHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI2dldERlZmF1bHRDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VDb25maWd1cmF0aW9uIGdldEFjdGl2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWNoZWNrQW5kTG9hZE1vZGVsKCk7Ci0JCXJldHVybiBmRGVmYXVsdFNlcnZpY2VDb25maWd1cmF0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI2dldEFjdGl2ZUNvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBnZXRBY3RpdmVDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJY2hlY2tBbmRMb2FkTW9kZWwoKTsKLQkJcmV0dXJuIGdldENvbmYoZkFjdGl2ZUNvbmZpZ3VyYXRpb25zLCBwcm9qZWN0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjZ2V0Q2F0ZWdvcmllcygpCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZUNhdGVnb3J5PiBnZXRDYXRlZ29yaWVzKCkgewotCQljaGVja0FuZExvYWRNb2RlbCgpOwotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SVNlcnZpY2VDYXRlZ29yeT4oZkNhdGVnb3JpZXMudmFsdWVzKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlciNnZXRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU2VydmljZUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmFtZSkgewotCQljaGVja0FuZExvYWRNb2RlbCgpOwotCQlNYXA8U3RyaW5nLCBJU2VydmljZUNvbmZpZ3VyYXRpb24+IGNvbmZNYXAgPSBnZXRDb25mKGZQcm9qZWN0Q29uZmlndXJhdGlvbnMsIHByb2plY3QpOwotCQlmb3IgKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25mIDogY29uZk1hcC52YWx1ZXMoKSkgewotCQkJaWYgKGNvbmYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBjb25mOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlciNnZXRDb25maWd1cmF0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKFN0cmluZyBpZCkgewotCQljaGVja0FuZExvYWRNb2RlbCgpOwotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25zLmdldChpZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI2dldENvbmZpZ3VyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgU2V0PElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gZ2V0Q29uZmlndXJhdGlvbnMoKSB7Ci0JCWNoZWNrQW5kTG9hZE1vZGVsKCk7Ci0JCXJldHVybiBuZXcgSGFzaFNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+KGZDb25maWd1cmF0aW9ucy52YWx1ZXMoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjZ2V0Q29uZmlndXJhdGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3VyYXRpb25zKElQcm9qZWN0IHByb2plY3QpIHsKLQkJY2hlY2tBbmRMb2FkTW9kZWwoKTsKLQkJcmV0dXJuIG5ldyBIYXNoU2V0PElTZXJ2aWNlQ29uZmlndXJhdGlvbj4oZ2V0Q29uZihmUHJvamVjdENvbmZpZ3VyYXRpb25zLCBwcm9qZWN0KS52YWx1ZXMoKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc2V0IG9mIHByb2plY3RzIHdoaWNoIHVzZSB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlQ29uZmlndXJhdGlvbiBUaGUgc2VydmljZSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBTZXQgb2YgcHJvamVjdHMgd2hpY2ggdXNlIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgU2V0PElQcm9qZWN0PiBnZXRQcm9qZWN0c0ZvckNvbmZpZ3VyYXRpb24oSVNlcnZpY2VDb25maWd1cmF0aW9uIHNlcnZpY2VDb25maWd1cmF0aW9uKSB7Ci0JCWNoZWNrQW5kTG9hZE1vZGVsKCk7Ci0KLQkJU2V0PElQcm9qZWN0PiBwcm9qZWN0czsKLQkJU2V0PElQcm9qZWN0PiBwcm9qZWN0c0ZvckNvbmZpZzsKLQkJCi0JCQkvLyBHZXQgdGhlIHNldCBvZiBwcm9qZWN0cyBrbm93biB0byB0aGUgc2VydmljZSBtb2RlbCBtYW5hZ2VyCi0JCXByb2plY3RzID0gZlByb2plY3RDb25maWd1cmF0aW9ucy5rZXlTZXQoKTsKLQkJcHJvamVjdHNGb3JDb25maWcgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oKTsKLQkJCS8vIEZvciBlYWNoIHByb2plY3QsIGNoZWNrIGlmIGl0IHVzZXMgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkJCS8vIElmIHNvLCBhZGQgdGhlIHByb2plY3QgdG8gdGhlIHByb2plY3RzRm9yQ29uZmlnIHNldC4KLQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMpIHsKLQkJCVNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGNvbmZpZ3M7Ci0JCQkKLQkJCWNvbmZpZ3MgPSBnZXRDb25maWd1cmF0aW9ucyhwcm9qZWN0KTsKLQkJCWZvciAoSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZyA6IGNvbmZpZ3MpIHsKLQkJCQlpZiAoY29uZmlnID09IHNlcnZpY2VDb25maWd1cmF0aW9uKSB7Ci0JCQkJCXByb2plY3RzRm9yQ29uZmlnLmFkZChwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RzRm9yQ29uZmlnOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI2dldFNlcnZpY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2UgZ2V0U2VydmljZShTdHJpbmcgaWQpIHsKLQkJbG9hZFNlcnZpY2VzRnJvbUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBmU2VydmljZXMuZ2V0KGlkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjZ2V0U2VydmljZVByb3ZpZGVyKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBJU2VydmljZVByb3ZpZGVyIGdldFNlcnZpY2VQcm92aWRlcihJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoU2VydmljZXNDb3JlUGx1Z2luLlBMVUdJTl9JRCwJUFJPVklERVJfRVhURU5TSU9OX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUFJPVklERVJfRUxFTUVOVF9OQU1FKSkgewotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfSUQpLmVxdWFscyhkZXNjLmdldElkKCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IChJU2VydmljZVByb3ZpZGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUl9DTEFTUyk7Ci0JCQkJCQkJCXByb3ZpZGVyLnNldERlc2NyaXB0b3IoZGVzYyk7Ci0JCQkJCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlTZXJ2aWNlc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhlKTsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI2dldFNlcnZpY2VzKCkKLQkgKi8KLQlwdWJsaWMgU2V0PElTZXJ2aWNlPiBnZXRTZXJ2aWNlcygpIHsKLQkJbG9hZFNlcnZpY2VzRnJvbUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBmU2VydmljZVNldDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjZ2V0U2VydmljZXMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZT4gZ2V0U2VydmljZXMoSVByb2plY3QgcHJvamVjdCkgewotCQljaGVja0FuZExvYWRNb2RlbCgpOwotCQlyZXR1cm4gZ2V0Q29uZihmUHJvamVjdFNlcnZpY2VzLCBwcm9qZWN0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjZ2V0U2VydmljZXMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU2V0PElTZXJ2aWNlPiBnZXRTZXJ2aWNlcyhTdHJpbmcgbmF0dXJlSWQpIHsKLQkJbG9hZFNlcnZpY2VzRnJvbUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBmTmF0dXJlU2VydmljZXMuZ2V0KG5hdHVyZUlkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjaXNDb25maWd1cmVkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWNoZWNrQW5kTG9hZE1vZGVsKCk7Ci0JCXJldHVybiBmUHJvamVjdENvbmZpZ3VyYXRpb25zLmNvbnRhaW5zS2V5KHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHNlcnZpY2UgbW9kZWwgY29uZmlndXJhdGlvbiB3aXRoIHdoYXQgaXMKLQkgKiBzcGVjaWZpZWQgaW4gdGhlIGRlZmF1bHQgc2F2ZSBmaWxlLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAotCSAqIHRoZW4gdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUKLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTxjb2RlPiBwbHVnaW4uCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTW9kZWxDb25maWd1cmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZFNlcnZpY2VzRnJvbUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUZpbGUgZmlsZSA9IGRlZmF1bHRTYXZlRmlsZS50b0ZpbGUoKTsKLQkJaWYoZmlsZS5leGlzdHMoKSkgewotCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0JCQl0cnkgewotCQkJCWxvYWRNb2RlbENvbmZpZ3VyYXRpb24ocmVhZGVyKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBTZXJ2aWNlTW9kZWxFdmVudCh0aGlzLCBJU2VydmljZU1vZGVsRXZlbnQuU0VSVklDRV9NT0RFTF9MT0FERUQpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgc2VydmljZSBtb2RlbCBjb25maWd1cmF0aW9uIHdpdGggd2hhdCBpcwotCSAqIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gPGNvZGU+ZmlsZTwvY29kZT4uCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlPGNvZGU+IHBsdWdpbi4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRNb2RlbENvbmZpZ3VyYXRpb24oUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJZk1vZGVsTG9hZGVkID0gdHJ1ZTsgLy8gYXZvaWQgcmUtZW50cnkKLQotCQlpbml0aWFsaXplKCk7IC8vIENsZWFyIG91dCB0aGUgZXhpc3RpbmcgbW9kZWwKLQkJCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlYTUxNZW1lbnRvIHJvb3RNZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVSZWFkUm9vdChyZWFkZXIpOwotCQkKLQkJZm9yIChJTWVtZW50byBjb25maWdNZW1lbnRvIDogcm9vdE1lbWVudG8uZ2V0Q2hpbGRyZW4oU0VSVklDRV9DT05GSUdVUkFUSU9OX0VMRU1FTlRfTkFNRSkpIHsKLQkJCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZ01lbWVudG8uZ2V0U3RyaW5nKEFUVFJfSUQpOwotCQkJU3RyaW5nIGNvbmZpZ05hbWUgPSBjb25maWdNZW1lbnRvLmdldFN0cmluZyhBVFRSX05BTUUpOwotCQkJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3U2VydmljZUNvbmZpZ3VyYXRpb24oY29uZmlnSWQsIGNvbmZpZ05hbWUpOwotCQkJCi0JCQlmb3IgKElNZW1lbnRvIHNlcnZpY2VNZW1lbnRvIDogY29uZmlnTWVtZW50by5nZXRDaGlsZHJlbihTRVJWSUNFX0VMRU1FTlRfTkFNRSkpIHsKLQkJCQlTdHJpbmcgc2VydmljZUlkID0gc2VydmljZU1lbWVudG8uZ2V0U3RyaW5nKEFUVFJfSUQpOwotCQkJCUlTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHNlcnZpY2VJZCk7Ci0JCQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IGxvYWRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU1lbWVudG8sIHNlcnZpY2UpOwotCQkJCWNvbmZpZy5zZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSwgcHJvdmlkZXIpOwotCQkJfQotCQkJCi0JCQlmb3IgKElNZW1lbnRvIGRpc2FibGVkTWVtZW50byA6IGNvbmZpZ01lbWVudG8uZ2V0Q2hpbGRyZW4oRElTQUJMRURfUFJPVklERVJTX0VMRU1FTlRfTkFNRSkpIHsKLQkJCQlTdHJpbmcgc2VydmljZUlkID0gZGlzYWJsZWRNZW1lbnRvLmdldFN0cmluZyhBVFRSX0lEKTsKLQkJCQlJU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShzZXJ2aWNlSWQpOwotCQkJCWZvciAoSU1lbWVudG8gcHJvdmlkZXJNZW1lbnRvIDogZGlzYWJsZWRNZW1lbnRvLmdldENoaWxkcmVuKFBST1ZJREVSX0VMRU1FTlRfTkFNRSkpIHsKLQkJCQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IGxvYWRTZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXJNZW1lbnRvLCBzZXJ2aWNlKTsKLQkJCQkJY29uZmlnLmFkZEZvcm1lclNlcnZpY2VQcm92aWRlcihzZXJ2aWNlLCBwcm92aWRlcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmQ29uZmlndXJhdGlvbnMucHV0KGNvbmZpZ0lkLCBjb25maWcpOwotCQl9Ci0JCQotCQlmb3IgKElNZW1lbnRvIHByb2plY3RNZW1lbnRvIDogcm9vdE1lbWVudG8uZ2V0Q2hpbGRyZW4oUFJPSkVDVF9FTEVNRU5UX05BTUUpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0TWVtZW50by5nZXRTdHJpbmcoQVRUUl9OQU1FKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCi0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJZm9yIChJTWVtZW50byBjb25maWdNZW1lbnRvIDogcHJvamVjdE1lbWVudG8uZ2V0Q2hpbGRyZW4oU0VSVklDRV9DT05GSUdVUkFUSU9OX0VMRU1FTlRfTkFNRSkpIHsKLQkJCQlTdHJpbmcgY29uZmlnSWQgPSBjb25maWdNZW1lbnRvLmdldFN0cmluZyhBVFRSX0lEKTsKLQkJCQlJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gZkNvbmZpZ3VyYXRpb25zLmdldChjb25maWdJZCk7Ci0JCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCWFkZENvbmZpZ3VyYXRpb24ocHJvamVjdCwgY29uZmlnKTsKLQkJCQkJQm9vbGVhbiBhY3RpdmUgPSBjb25maWdNZW1lbnRvLmdldEJvb2xlYW4oQVRUUl9BQ1RJVkUpOwotCQkJCQlpZiAoYWN0aXZlICE9IG51bGwgJiYgYWN0aXZlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlzZXRBY3RpdmVDb25maWd1cmF0aW9uKHByb2plY3QsIGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjbmV3U2VydmljZUNvbmZpZ3VyYXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VDb25maWd1cmF0aW9uIG5ld1NlcnZpY2VDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXdTZXJ2aWNlQ29uZmlndXJhdGlvbihVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpLCBuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhbiBldmVudCBvY2N1cnJlbmNlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUKLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTxjb2RlPiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IGV2ZW50IHRvIG5vdGlmeQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhJU2VydmljZU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJZkV2ZW50TWFuYWdlci5ub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludHMgdGhlIGN1cnJlbnQgc2VydmljZSBtb2RlbCB0byB0aGUgY29uc29sZSwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFNlcnZpY2VNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aWNlIE1vZGVsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihmUHJvamVjdENvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBTZXJ2aWNlIE1vZGVsIGlzIGVtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZvcihFbnRyeTxJUHJvamVjdCwgTWFwPFN0cmluZywgSVNlcnZpY2VDb25maWd1cmF0aW9uPj4gZW50cnkgOiBmUHJvamVjdENvbmZpZ3VyYXRpb25zLmVudHJ5U2V0KCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBQcm9qZWN0OiAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IoSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmYgOiBlbnRyeS5nZXRWYWx1ZSgpLnZhbHVlcygpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAiICsgY29uZik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI3JlbW92ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVByb2plY3QgcHJvamVjdCkgewotCQljaGVja0FuZExvYWRNb2RlbCgpOwotCQlpZihwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWZQcm9qZWN0Q29uZmlndXJhdGlvbnMucmVtb3ZlKHByb2plY3QpOwotCQlmQWN0aXZlQ29uZmlndXJhdGlvbnMucmVtb3ZlKHByb2plY3QpOwotCQlmUHJvamVjdFNlcnZpY2VzLnJlbW92ZShwcm9qZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlciNyZW1vdmUob3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZikgewotCQljaGVja0FuZExvYWRNb2RlbCgpOwotCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBmUHJvamVjdENvbmZpZ3VyYXRpb25zLmtleVNldCgpKSB7Ci0JCQlyZW1vdmVDb25maWd1cmF0aW9uKHByb2plY3QsIGNvbmYpOwotCQkJaWYgKGNvbmYuZXF1YWxzKGdldEFjdGl2ZUNvbmZpZ3VyYXRpb24ocHJvamVjdCkpKSB7Ci0JCQkJZkFjdGl2ZUNvbmZpZ3VyYXRpb25zLnJlbW92ZShwcm9qZWN0KTsKLQkJCX0KLQkJfQotCQlmQ29uZmlndXJhdGlvbnMucmVtb3ZlKGNvbmYuZ2V0SWQoKSk7Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgU2VydmljZU1vZGVsRXZlbnQoY29uZiwgSVNlcnZpY2VNb2RlbEV2ZW50LlNFUlZJQ0VfQ09ORklHVVJBVElPTl9SRU1PVkVEKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI3JlbW92ZUNvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25mKSB7Ci0JCWNoZWNrQW5kTG9hZE1vZGVsKCk7Ci0JCU1hcDxTdHJpbmcsIElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gY29uZnMgPSBnZXRDb25mKGZQcm9qZWN0Q29uZmlndXJhdGlvbnMsIHByb2plY3QpOwotCQlpZihjb25mcyAhPSBudWxsKSB7Ci0JCQljb25mcy5yZW1vdmUoY29uZi5nZXRJZCgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI3JlbW92ZUV2ZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbEV2ZW50TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lcihJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmRXZlbnRNYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlcyB0aGUgbW9kZWwgY29uZmlndXJhdGlvbiBpbnRvIHRoZSBwbHVnaW4ncyBtZXRhZGF0YSBhcmVhIHVzaW5nCi0JICogdGhlIGRlZmF1bHQgZmlsZSBuYW1lLgotCSAqIFdpbGwgbm90IHNhdmUgZGF0YSBmb3IgcHJvamVjdHMgdGhhdCBkbyBub3QgZXhpc3QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlPGNvZGU+IHBsdWdpbi4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGVsQ29uZmlndXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrQW5kTG9hZE1vZGVsKCk7Ci0JCUZpbGUgZmlsZSA9IGRlZmF1bHRTYXZlRmlsZS50b0ZpbGUoKTsKLQkJQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGUpKTsKLQkJdHJ5IHsKLQkJCXNhdmVNb2RlbENvbmZpZ3VyYXRpb24od3JpdGVyKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHRoZSBzZXJ2aWNlIG1vZGVsIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+LgotCSAqIFdpbGwgbm90IHNhdmUgZGF0YSBmb3IgcHJvamVjdHMgdGhhdCBkbyBub3QgZXhpc3QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlPGNvZGU+IHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBmaWxlIGlzIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWxDb25maWd1cmF0aW9uKFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKHdyaXRlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCXNhdmVNb2RlbENvbmZpZ3VyYXRpb24oZkNvbmZpZ3VyYXRpb25zLCBmUHJvamVjdENvbmZpZ3VyYXRpb25zLCBmQWN0aXZlQ29uZmlndXJhdGlvbnMsIHdyaXRlcik7Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgU2VydmljZU1vZGVsRXZlbnQodGhpcywgSVNlcnZpY2VNb2RlbEV2ZW50LlNFUlZJQ0VfTU9ERUxfU0FWRUQpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIjc2V0QWN0aXZlQ29uZmlndXJhdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUNvbmZpZ3VyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJY2hlY2tBbmRMb2FkTW9kZWwoKTsKLQotCQlNYXA8U3RyaW5nLCBJU2VydmljZUNvbmZpZ3VyYXRpb24+IGNvbmZzID0gZ2V0Q29uZihmUHJvamVjdENvbmZpZ3VyYXRpb25zLCBwcm9qZWN0KTsKLQkJCi0JCWlmKCFjb25mcy5jb250YWluc0tleShjb25maWd1cmF0aW9uLmdldElkKCkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCWZBY3RpdmVDb25maWd1cmF0aW9ucy5wdXQocHJvamVjdCwgY29uZmlndXJhdGlvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyI3NldERlZmF1bHRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJZkRlZmF1bHRTZXJ2aWNlQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBTZXJ2aWNlTW9kZWxFdmVudChjb25maWcsIElTZXJ2aWNlTW9kZWxFdmVudC5TRVJWSUNFX0NPTkZJR1VSQVRJT05fU0VMRUNURUQpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIG1vZGVsIGlzIGFscmVhZHkgbG9hZGVkLiBJZiBub3QsIGxvYWQgaXQuCi0JICogCi0JICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBtb2RlbCBpcyBsb2FkZWQgcHJpb3IgdG8gYWNjZXNzaW5nIGl0LgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0FuZExvYWRNb2RlbCgpIHsKLQkJaWYgKCFmTW9kZWxMb2FkZWQpIHsKLQkJCXRyeSB7Ci0JCQkJbG9hZE1vZGVsQ29uZmlndXJhdGlvbigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTZXJ2aWNlc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZkFjdGl2ZUNvbmZpZ3VyYXRpb25zLmNsZWFyKCk7Ci0JCWZQcm9qZWN0Q29uZmlndXJhdGlvbnMuY2xlYXIoKTsKLQkJZlByb2plY3RTZXJ2aWNlcy5jbGVhcigpOwotCQlmQ29uZmlndXJhdGlvbnMuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCBhIHNlcnZpY2UgcHJvdmlkZXIgZnJvbSBwZXJzaXN0ZW50IHN0YXRlCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyTWVtZW50bwotCSAqIEBwYXJhbSBzZXJ2aWNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVNlcnZpY2VQcm92aWRlciBsb2FkU2VydmljZVByb3ZpZGVyKElNZW1lbnRvIHByb3ZpZGVyTWVtZW50bywgSVNlcnZpY2Ugc2VydmljZSkgewotCQlpZihzZXJ2aWNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZyBwcm92aWRlcklkID0gcHJvdmlkZXJNZW1lbnRvLmdldFN0cmluZyhBVFRSX1BST1ZJREVSX0lEKTsKLQkJSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHNlcnZpY2UuZ2V0UHJvdmlkZXJEZXNjcmlwdG9yKHByb3ZpZGVySWQpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0U2VydmljZVByb3ZpZGVyKGRlc2NyaXB0b3IpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBTZXJ2aWNlUHJvdmlkZXIpIHsKLQkJCQkJSU1lbWVudG8gcHJvdmlkZXJDb25maWdNZW1lbnRvID0gcHJvdmlkZXJNZW1lbnRvLmdldENoaWxkKFBST1ZJREVSX0NPTkZJR1VSQVRJT05fRUxFTUVOVF9OQU1FKTsKLQkJCQkJKChTZXJ2aWNlUHJvdmlkZXIpcHJvdmlkZXIpLnJlc3RvcmVTdGF0ZShwcm92aWRlckNvbmZpZ01lbWVudG8pOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9IAotCQkJZWxzZSB7Ci0JCQkJU2VydmljZXNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvck1lc3NhZ2UoTWVzc2FnZXMuU2VydmljZU1vZGVsTWFuYWdlcl8yKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVNlcnZpY2VzQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3JNZXNzYWdlKE1lc3NhZ2VzLlNlcnZpY2VNb2RlbE1hbmFnZXJfMCArIHByb3ZpZGVySWQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzZXJ2aWNlIGV4dGVuc2lvbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRTZXJ2aWNlc0Zyb21FeHRlbnNpb25SZWdpc3RyeSgpIHsKLQkJaWYgKGZTZXJ2aWNlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZlNlcnZpY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXJ2aWNlPigpOwotCQlmQ2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNhdGVnb3J5PigpOwotCQlmU2VydmljZVNldCA9IG5ldyBIYXNoU2V0PElTZXJ2aWNlPigpOwotCQlmTmF0dXJlU2VydmljZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxJU2VydmljZT4+KCk7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChTZXJ2aWNlc0NvcmVQbHVnaW4uUExVR0lOX0lELCBDQVRFR09SWV9FWFRFTlNJT05fSUQpOwotCQlpZihleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlmb3IgKElFeHRlbnNpb24gZXh0ZW5zaW9uIDogZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0JCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkgewotCQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKENBVEVHT1JZX0VMRU1FTlRfTkFNRSkpIHsKLQkJCQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfSUQpOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQkJCQkJU2VydmljZUNhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IFNlcnZpY2VDYXRlZ29yeShpZCwgbmFtZSk7Ci0JCQkJCQlmQ2F0ZWdvcmllcy5wdXQoaWQsIGNhdGVnb3J5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLSAgICAgICAgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFNlcnZpY2VzQ29yZVBsdWdpbi5QTFVHSU5fSUQsIFNFUlZJQ0VfRVhURU5TSU9OX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoU0VSVklDRV9FTEVNRU5UX05BTUUpKSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0lEKTsKLQkJCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJCQkJCVN0cmluZyBwcmlvcml0eSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfUFJJT1JJVFkpOwotCQkJCQkJU3RyaW5nIGNhdGVnb3J5SWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NBVEVHT1JZX0lEKTsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG5hdHVyZUNvbmYgPSBlbGVtZW50LmdldENoaWxkcmVuKE5BVFVSRV9FTEVNRU5UX05BTUUpOwotCQkJCQkJU2V0PFN0cmluZz4gbmF0dXJlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQkJCWlmIChuYXR1cmVDb25mICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBuYXR1cmUgOiBuYXR1cmVDb25mKSB7Ci0JCQkJCQkJCVN0cmluZyBuYXR1cmVJZCA9IG5hdHVyZS5nZXRBdHRyaWJ1dGUoQVRUUl9JRCk7Ci0JCQkJCQkJCWlmICh3b3Jrc3BhY2UuZ2V0TmF0dXJlRGVzY3JpcHRvcihuYXR1cmVJZCkgIT0gbnVsbCkgewotCQkJCQkJCQkJbmF0dXJlcy5hZGQobmF0dXJlSWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoaWQsIG5hbWUsIHByaW9yaXR5LCBuYXR1cmVzKTsKLQkJCQkJCWZTZXJ2aWNlU2V0LmFkZChzZXJ2aWNlKTsKLQkJCQkJCWZTZXJ2aWNlcy5wdXQoaWQsIHNlcnZpY2UpOwotCQkJCQkJZm9yIChTdHJpbmcgbmF0dXJlIDogbmF0dXJlcykgewotCQkJCQkJCVNldDxJU2VydmljZT4gc3ZjcyA9IGZOYXR1cmVTZXJ2aWNlcy5nZXQobmF0dXJlKTsKLQkJCQkJCQlpZiAoc3ZjcyA9PSBudWxsKSB7Ci0JCQkJCQkJCXN2Y3MgPSBuZXcgSGFzaFNldDxJU2VydmljZT4oKTsKLQkJCQkJCQkJZk5hdHVyZVNlcnZpY2VzLnB1dChuYXR1cmUsIHN2Y3MpOwotCQkJCQkJCX0KLQkJCQkJCQlzdmNzLmFkZChzZXJ2aWNlKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9OVUxMX1BST1ZJREVSX0NMQVNTKSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSVNlcnZpY2VQcm92aWRlciBudWxsUHJvdmlkZXIgPSAoSVNlcnZpY2VQcm92aWRlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfTlVMTF9QUk9WSURFUl9DTEFTUyk7Ci0JCQkJCQkJCWlmKG51bGxQcm92aWRlciBpbnN0YW5jZW9mIFNlcnZpY2VQcm92aWRlcikgewotCQkJCQkJCQkJU3RyaW5nIHByb3ZpZGVySWQgPSBzZXJ2aWNlLmdldElkKCkgKyAiLm51bGxQcm92aWRlciI7Ci0JCQkJCQkJCQlTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcihwcm92aWRlcklkLCAiTnVsbCBQcm92aWRlciIsIHNlcnZpY2UuZ2V0SWQoKSwgIjAiKTsKLQkJCQkJCQkJCSgoU2VydmljZVByb3ZpZGVyKW51bGxQcm92aWRlcikuc2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlzZXJ2aWNlLnNldE51bGxTZXJ2aWNlUHJvdmlkZXIobnVsbFByb3ZpZGVyKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJU2VydmljZXNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlTZXJ2aWNlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBmQ2F0ZWdvcmllcy5nZXQoY2F0ZWdvcnlJZCk7Ci0JCQkJCQlpZihjYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQkJCQkJY2F0ZWdvcnkuYWRkU2VydmljZShzZXJ2aWNlKTsKLQkJCQkJCQlzZXJ2aWNlLnNldENhdGVnb3J5KGNhdGVnb3J5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotICAgICAgICBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoU2VydmljZXNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgUFJPVklERVJfRVhURU5TSU9OX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUFJPVklERVJfRUxFTUVOVF9OQU1FKSkgewotCQkJCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9JRCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgcHJpb3JpdHkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1BSSU9SSVRZKTsKLQkJCQkJCVN0cmluZyBzZXJ2aWNlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1NFUlZJQ0VfSUQpOwotCQkJCQkJSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzYyA9IG5ldyBTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yKGlkLCBuYW1lLCBzZXJ2aWNlSWQsIHByaW9yaXR5KTsKLQkJCQkJCVNlcnZpY2Ugc2VydmljZSA9IGZTZXJ2aWNlcy5nZXQoc2VydmljZUlkKTsKLQkJCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCQlzZXJ2aWNlLmFkZFNlcnZpY2VQcm92aWRlcihkZXNjKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU2VydmljZXNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvck1lc3NhZ2UoCi0JCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5TZXJ2aWNlc19pbnZhbGlkU2VydmljZUlkLCBzZXJ2aWNlSWQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgc2VydmljZSBjb25maWd1cmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBpZCBhbmQgbmFtZS4gVXNlZCB3aGVuCi0JICogcmVzdG9yaW5nIHNhdmVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCBpZCBvZiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHNlcnZpY2UgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gc2VydmljZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBTZXJ2aWNlQ29uZmlndXJhdGlvbiBuZXdTZXJ2aWNlQ29uZmlndXJhdGlvbihTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXcgU2VydmljZUNvbmZpZ3VyYXRpb24oaWQsIG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL1NlcnZpY2VQcm92aWRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvU2VydmljZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NjJmMDUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvU2VydmljZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHNlcnZpY2UgcHJvdmlkZXIgaW1wbGVtZW50YXRpb25zLiAKLSAqIAotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG9yCi0gKiB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcKLSAqIHdpdGggdGhlIFJEVCB0ZWFtLgotICogCi0gKiBAYXV0aG9yIHZrb25nCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmljZVByb3ZpZGVyIGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJU2VydmljZVByb3ZpZGVyLCBJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciB7Ci0JCi0JcHJpdmF0ZSBJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciBmRGVzY3JpcHRvcjsKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGZBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCi0JcHVibGljIFNlcnZpY2VQcm92aWRlcigpIHsKLQl9Ci0KLQlwdWJsaWMgU2VydmljZVByb3ZpZGVyKFNlcnZpY2VQcm92aWRlciBwcm92aWRlcikgewotCQlzZXREZXNjcmlwdG9yKHByb3ZpZGVyLmdldERlc2NyaXB0b3IoKSk7Ci0JCWZBdHRyaWJ1dGVzLnB1dEFsbChwcm92aWRlci5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiBzZXJ2aWNlIHByb3ZpZGVyIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGZBdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyI2dldEJvb2xlYW4oamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhrZXksIG51bGwpOwotCQlib29sZWFuIHJlc3VsdCA9IGRlZmF1bHRWYWx1ZTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyI2dldENvbmZpZ3VyYXRpb25TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIGlzQ29uZmlndXJlZCgpID8gTWVzc2FnZXMuU2VydmljZVByb3ZpZGVyXzAgOiBNZXNzYWdlcy5TZXJ2aWNlUHJvdmlkZXJfMTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlciNnZXREZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlpZiAoZkRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZEZXNjcmlwdG9yLmdldElkKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlciNnZXRJbnQoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBrZXksIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGtleSwgbnVsbCk7Ci0JCWludCByZXN1bHQgPSBkZWZhdWx0VmFsdWU7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBVc2UgZGVmYXVsdAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZkRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZEZXNjcmlwdG9yLmdldE5hbWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciNnZXRQcmlvcml0eSgpCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0UHJpb3JpdHkoKSB7Ci0JCWlmIChmRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3IuZ2V0UHJpb3JpdHkoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IjZ2V0U2VydmljZUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJZCgpIHsKLQkJaWYgKGZEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmRGVzY3JpcHRvci5nZXRTZXJ2aWNlSWQoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyI2dldFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpCi0JewotCQlTdHJpbmcgdmFsdWUgPSBmQXR0cmlidXRlcy5nZXQoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIjcHV0Qm9vbGVhbihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewotCQlTdHJpbmcgc3RyVmFsID0gQm9vbGVhbi50b1N0cmluZyh2YWx1ZSk7Ci0JCXB1dFN0cmluZyhrZXksIHN0clZhbCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlciNwdXRJbnQoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpIHsKLQkJU3RyaW5nIHN0clZhbCA9IEludGVnZXIudG9TdHJpbmcodmFsdWUpOwotCQlwdXRTdHJpbmcoa2V5LCBzdHJWYWwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIjcHV0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlmQXR0cmlidXRlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JCi0JcHVibGljIFNldDxTdHJpbmc+IGtleVNldCgpIHsKLQkJcmV0dXJuIGZBdHRyaWJ1dGVzLmtleVNldCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgc3RhdGUgb2YgdGhpcyBwcm92aWRlciBmcm9tIHRoZQotCSAqIGdpdmVuIDxjb2RlPklNZW1lbnRvPC9jb2RlPi4KLQkgKiAKLQkgKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmIGEgcHJvdmlkZXIgCi0JICogd2lzaGVzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgotCSAqIAotCSAqIEBwYXJhbSBtZW1lbnRvIGZvciByZXN0b3JpbmcgdGhlIHByb3ZpZGVyJ3Mgc3RhdGUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJZkF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJZm9yIChTdHJpbmcga2V5IDogbWVtZW50by5nZXRBdHRyaWJ1dGVLZXlzKCkpIHsKLQkJCWZBdHRyaWJ1dGVzLnB1dChrZXksIG1lbWVudG8uZ2V0U3RyaW5nKGtleSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoaXMgcHJvdmlkZXIgaW4gdGhlIGdpdmVuCi0JICogPGNvZGU+SU1lbWVudG88L2NvZGU+LiAKLQkgKiAKLQkgKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmIGEgcHJvdmlkZXIgIAotCSAqIHdpc2hlcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVtZW50byBmb3Igc2F2aW5nIHRoZSBwcm92aWRlcidzIHN0YXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCWZvciAoU3RyaW5nIGtleSA6IGZBdHRyaWJ1dGVzLmtleVNldCgpKSB7Ci0JCQltZW1lbnRvLnB1dFN0cmluZyhrZXksIGZBdHRyaWJ1dGVzLmdldChrZXkpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIjc2V0RGVzY3JpcHRvcihvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJdGhpcy5mRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JfQotCi0JLy8gZ2VuZXJhdGVkIGJ5IGVjbGlwc2UKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IHJlc3VsdCA9IDE7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0Ci0JCQkJKyAoKGZEZXNjcmlwdG9yID09IG51bGwpID8gMCA6IGZEZXNjcmlwdG9yLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIGdlbmVyYXRlZCBieSBlY2xpcHNlCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVNlcnZpY2VQcm92aWRlciBvdGhlciA9IChTZXJ2aWNlUHJvdmlkZXIpIG9iajsKLQkJaWYgKGZEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5mRGVzY3JpcHRvciAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghZkRlc2NyaXB0b3IuZXF1YWxzKG90aGVyLmZEZXNjcmlwdG9yKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9TZXJ2aWNlc0NvcmVQbHVnaW4uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL1NlcnZpY2VzQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZmQ3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL1NlcnZpY2VzQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG9yCi0gKiB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcKLSAqIHdpdGggdGhlIFJEVCB0ZWFtLgotICogCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VzQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBTZXJ2aWNlc0NvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFNlcnZpY2VzQ29yZVBsdWdpbigpIHsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQotCQlQcm9qZWN0RGVsZXRpb25MaXN0ZW5lci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVByb2plY3REZWxldGlvbkxpc3RlbmVyLnN0b3BMaXN0ZW5pbmcoKTsKLQkJCXRyeSB7Ci0JCQkJU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnNhdmVNb2RlbENvbmZpZ3VyYXRpb24oKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nKGUpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJcGx1Z2luID0gbnVsbDsKLQkJCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmljZXNDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIkVycm9yIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2dFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjZjIwOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5tZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUubWVzc2FnZXMubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlTW9kZWxNYW5hZ2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZU1vZGVsTWFuYWdlcl8xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZU1vZGVsTWFuYWdlcl8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZVByb3ZpZGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZVByb3ZpZGVyXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlc19pbnZhbGlkU2VydmljZUlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VzX3NhdmVTZXJ2aWNlRXJyb3I7Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9CQkKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZGZlYTEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU2VydmljZU1vZGVsTWFuYWdlcl8wPVVua25vd24gcHJvdmlkZXIgSUQ6IAotU2VydmljZU1vZGVsTWFuYWdlcl8xPVVua25vd24gc2VydmljZSBJRDogCi1TZXJ2aWNlTW9kZWxNYW5hZ2VyXzI9Q291bGQgbm90IGluc3RhbnRpYXRlIHNlcnZpY2UgcHJvdmlkZXIKLVNlcnZpY2VQcm92aWRlcl8wPUNvbmZpZ3VyZWQKLVNlcnZpY2VQcm92aWRlcl8xPU5vdCBjb25maWd1cmVkCi1TZXJ2aWNlc19pbnZhbGlkU2VydmljZUlkPVNlcnZpY2UgcHJvdmlkZXIgcmVmZXJzIHRvIGludmFsaWQgc2VydmljZSBJRDogezB9Ci1TZXJ2aWNlc19zYXZlU2VydmljZUVycm9yPVNlcnZpY2UgezB9IGNvdWxkIG5vdCBiZSBzYXZlZCBmb3IgcHJvamVjdCB7MX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2UuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5MzU2MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvY29yZS9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBncmVnCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZSBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSVNlcnZpY2UgewotCXByaXZhdGUgU3RyaW5nIGZTZXJ2aWNlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNlcnZpY2VOYW1lOwotCXByaXZhdGUgSW50ZWdlciBmU2VydmljZVByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBmU2VydmljZU5hdHVyZXM7Ci0JcHJpdmF0ZSBTZXQ8SVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I+IGZTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I+IGZJZFRvU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I+KCk7Ci0JcHJpdmF0ZSBJU2VydmljZUNhdGVnb3J5IGNhdGVnb3J5OwotCQotCXByaXZhdGUgSVNlcnZpY2VQcm92aWRlciBudWxsUHJvdmlkZXI7Ci0JCi0JCi0JcHVibGljIFNlcnZpY2UoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHByaW9yaXR5LCBTZXQ8U3RyaW5nPm5hdHVyZXMpIHsKLQkJZlNlcnZpY2VJZCA9IGlkOwotCQlmU2VydmljZU5hbWUgPSBuYW1lOwotCQlpZiAocHJpb3JpdHkgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmU2VydmljZVByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludChwcmlvcml0eSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZQotCQkJfQotCQl9Ci0JCWZTZXJ2aWNlTmF0dXJlcyA9IG5hdHVyZXM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlI2FkZFNlcnZpY2VQcm92aWRlcihvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXIpIHsKLQkJZlNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3JzLmFkZChwcm92aWRlcik7Ci0JCWZJZFRvU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvck1hcC5wdXQocHJvdmlkZXIuZ2V0SWQoKSwgcHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlciBudWxsUHJvdmlkZXIpIHsKLQkJdGhpcy5udWxsUHJvdmlkZXIgPSBudWxsUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBJU2VydmljZVByb3ZpZGVyIGdldE51bGxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGxQcm92aWRlcjsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSVNlcnZpY2UpIHsKLQkJCXJldHVybiAoKElTZXJ2aWNlKSBvKS5nZXRJZCgpLmVxdWFscyhmU2VydmljZUlkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2UjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmU2VydmljZUlkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZTZXJ2aWNlTmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2UjZ2V0TmF0dXJlcygpCi0JICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldE5hdHVyZXMoKSB7Ci0JCXJldHVybiBmU2VydmljZU5hdHVyZXM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlI2dldFByaW9yaXR5KCkKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIGZTZXJ2aWNlUHJpb3JpdHk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlI2dldFByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGdldFByb3ZpZGVyRGVzY3JpcHRvcihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGZJZFRvU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvck1hcC5nZXQoaWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlI2dldFByb3ZpZGVycygpCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4gZ2V0UHJvdmlkZXJzKCkgewotCQlyZXR1cm4gZlNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3JzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlI2dldFByb3ZpZGVyc0J5UHJpb3JpdHkoKQotCSAqLwotCXB1YmxpYyBTb3J0ZWRTZXQ8SVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I+IGdldFByb3ZpZGVyc0J5UHJpb3JpdHkoKSB7Ci0JCVNvcnRlZFNldDxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4gc29ydGVkUHJvdmlkZXJzID0gCi0JCQluZXcgVHJlZVNldDxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4obmV3IENvbXBhcmF0b3I8SVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciBvMSwgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgbzIpIHsKLQkJCQkJaW50IGNtcCA9IG8xLmdldFByaW9yaXR5KCkuY29tcGFyZVRvKG8yLmdldFByaW9yaXR5KCkpOwotCQkJCQlpZiAoY21wICE9IDApIHsKLQkJCQkJCXJldHVybiBjbXA7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG8xLmdldElkKCkuY29tcGFyZVRvKG8yLmdldElkKCkpOwotCQkJCX0KLQkJCX0pOwotCQlmb3IgKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIHAgOiBnZXRQcm92aWRlcnMoKSkgewotCQkJc29ydGVkUHJvdmlkZXJzLmFkZChwKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNvcnRlZFByb3ZpZGVyczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZTZXJ2aWNlSWQuaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2UjcmVtb3ZlU2VydmljZVByb3ZpZGVyKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcnZpY2VQcm92aWRlcihJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciBwcm92aWRlcikgewotCQlmU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcnMucmVtb3ZlKHByb3ZpZGVyKTsKLQkJZklkVG9TZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yTWFwLnJlbW92ZShwcm92aWRlci5nZXRJZCgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2aWNlKCIgKyBmU2VydmljZUlkICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShJU2VydmljZUNhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQl9Ci0JCi0JcHVibGljIElTZXJ2aWNlQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2VDYXRlZ29yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL2NvcmUvU2VydmljZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOWQ5MGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL2NvcmUvU2VydmljZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBNaWtlIEt1Y2VyYSAoSUJNKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDYXRlZ29yeTsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VDYXRlZ29yeSBpbXBsZW1lbnRzIElTZXJ2aWNlQ2F0ZWdvcnkgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIGZpbmFsIFNldDxJU2VydmljZT4gc2VydmljZXMgPSBuZXcgSGFzaFNldDxJU2VydmljZT4oKTsKLQkKLQlwdWJsaWMgU2VydmljZUNhdGVnb3J5KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoSVNlcnZpY2Ugc2VydmljZSkgewotCQlpZihzZXJ2aWNlICE9IG51bGwpCi0JCQlzZXJ2aWNlcy5hZGQoc2VydmljZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTZXQ8SVNlcnZpY2U+IGdldFNlcnZpY2VzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHNlcnZpY2VzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2VDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvY29yZS9TZXJ2aWNlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjExY2YzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2VDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VNb2RlbE1hbmFnZXI7Ci0KLS8qKgotICogQSBuYW1lZCBjb25maWd1cmF0aW9uIHdoaWNoIGNvbnNpc3RzIG9mIGEgbWFwcGluZyBvZiBzZXJ2aWNlcyB0byBwcm92aWRlcnMuCi0gKgotICogPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uIFRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIGFzCi0gKiBwYXJ0IG9mIGEgd29yayBpbiBwcm9ncmVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBBUEkgd2lsbCB3b3JrIG9yCi0gKiB0aGF0IGl0IHdpbGwgcmVtYWluIHRoZSBzYW1lLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIEFQSSB3aXRob3V0IGNvbnN1bHRpbmcKLSAqIHdpdGggdGhlIFJEVCB0ZWFtLgotICoKLSAqIEBzZWUgSVNlcnZpY2UKLSAqIEBzZWUgSVNlcnZpY2VQcm92aWRlciAKLSAqIEBhdXRob3IgY3JlY29za2llCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdCBpbXBsZW1lbnRzIElTZXJ2aWNlQ29uZmlndXJhdGlvbiB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBmSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBmTmFtZTsKLQlwcm90ZWN0ZWQgU2VydmljZU1vZGVsTWFuYWdlciBmTWFuYWdlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQlwcm90ZWN0ZWQgTWFwPElTZXJ2aWNlLCBJU2VydmljZVByb3ZpZGVyPiBmU2VydmljZVRvUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcDxJU2VydmljZSwgSVNlcnZpY2VQcm92aWRlcj4oKTsKLQlwcm90ZWN0ZWQgTWFwPElTZXJ2aWNlLCBMaW5rZWRIYXNoU2V0PElTZXJ2aWNlUHJvdmlkZXI+PiBmRm9ybWVyU2VydmljZVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPElTZXJ2aWNlLCBMaW5rZWRIYXNoU2V0PElTZXJ2aWNlUHJvdmlkZXI+PigpOwotCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQkJZklkID0gaWQ7Ci0JCWZOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb24jZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmSWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbiNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uI2dldFNlcnZpY2VQcm92aWRlcihvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZSkKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VQcm92aWRlciBnZXRTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2Ugc2VydmljZSkgewotCQlJU2VydmljZVByb3ZpZGVyIGFjdGl2ZVByb3ZpZGVyID0gZlNlcnZpY2VUb1Byb3ZpZGVyTWFwLmdldChzZXJ2aWNlKTsKLQkJcmV0dXJuIGFjdGl2ZVByb3ZpZGVyID09IG51bGwgPyBzZXJ2aWNlLmdldE51bGxQcm92aWRlcigpIDogYWN0aXZlUHJvdmlkZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgc2VydmljZSBwcm92aWRlcnMgdGhhdCB1c2VkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBzZXJ2aWNlLiAKLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGhlcmUgbWFpbmx5IGZvciB1c2UgYnkgdGhlIE5ld1NlcnZpY2VNb2RlbFdpZGdldC4KLQkgKiBUaGUgc2VydmljZSBjb25maWd1cmF0aW9uIHdpbGwgYXV0b21hdGljYWxseSByZW1lbWJlciBvbGQgc2VydmljZQotCSAqIHByb3ZpZGVycyBhbmQgdGhlaXIgc3RhdGUuIFRoYXQgd2F5IGlmIGEgdXNlciBzd2l0Y2hlcyBiYWNrIHRvIGFuCi0JICogb2xkIHByb3ZpZGVyIHRoZSBzdGF0ZSBjYW4gYmUgcmVzdG9yZWQgYW5kIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZQotCSAqIHRvIHNldCB1cCB0aGUgcHJvdmlkZXIgYWdhaW4uCi0JICogCi0JICogQHBhcmFtIHNlcnZpY2UgdGhlIHNlcnZpY2UKLQkgKiBAcmV0dXJuIHNldCBvZiBvbGQgc2VydmljZSBwcm92aWRlcnMKLQkgKiAKLQkgKiBAc2VlIE5ld1NlcnZpY2VNb2RlbFdpZGdldCBpbiB0aGUgc2VydmljZXMudWkgcGx1Z2luCi0JICovCi0JcHVibGljIFNldDxJU2VydmljZVByb3ZpZGVyPiBnZXRGb3JtZXJTZXJ2aWNlUHJvdmlkZXJzKElTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJU2V0PElTZXJ2aWNlUHJvdmlkZXI+IGRpc2FibGVkUHJvdmlkZXJzID0gZkZvcm1lclNlcnZpY2VQcm92aWRlcnMuZ2V0KHNlcnZpY2UpOwotCQlyZXR1cm4gZGlzYWJsZWRQcm92aWRlcnMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLjxJU2VydmljZVByb3ZpZGVyPmVtcHR5U2V0KCkgOiBkaXNhYmxlZFByb3ZpZGVyczsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uI2dldFNlcnZpY2VzKCkKLQkgKi8KLQlwdWJsaWMgU2V0PElTZXJ2aWNlPiBnZXRTZXJ2aWNlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChmU2VydmljZVRvUHJvdmlkZXJNYXAua2V5U2V0KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbiNnZXRTZXJ2aWNlc0J5UHJpb3JpdHkoKQotCSAqLwotCXB1YmxpYyBTb3J0ZWRTZXQ8SVNlcnZpY2U+IGdldFNlcnZpY2VzQnlQcmlvcml0eSgpIHsKLQkJU29ydGVkU2V0PElTZXJ2aWNlPiBzb3J0ZWRTZXJ2aWNlcyA9IAotCQkJbmV3IFRyZWVTZXQ8SVNlcnZpY2U+KG5ldyBDb21wYXJhdG9yPElTZXJ2aWNlPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoSVNlcnZpY2UgbzEsIElTZXJ2aWNlIG8yKSB7Ci0JCQkJCWludCBjbXAgPSBvMS5nZXRQcmlvcml0eSgpLmNvbXBhcmVUbyhvMi5nZXRQcmlvcml0eSgpKTsKLQkJCQkJaWYgKGNtcCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gY21wOwotCQkJCQl9Ci0JCQkJCXJldHVybiBvMS5nZXRJZCgpLmNvbXBhcmVUbyhvMi5nZXRJZCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCi0JCXNvcnRlZFNlcnZpY2VzLmFkZEFsbChnZXRTZXJ2aWNlcygpKTsKLQkJCi0JCXJldHVybiBzb3J0ZWRTZXJ2aWNlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uI3JlbW92ZVNlcnZpY2Uob3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2UpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VydmljZShJU2VydmljZSBzZXJ2aWNlKSB7Ci0JCUlTZXJ2aWNlUHJvdmlkZXIgb2xkUHJvdmlkZXIgPSBmU2VydmljZVRvUHJvdmlkZXJNYXAucmVtb3ZlKHNlcnZpY2UpOwotCQlmRm9ybWVyU2VydmljZVByb3ZpZGVycy5yZW1vdmUoc2VydmljZSk7Ci0KLQkJZk1hbmFnZXIubm90aWZ5TGlzdGVuZXJzKG5ldyBTZXJ2aWNlTW9kZWxFdmVudCh0aGlzLCBJU2VydmljZU1vZGVsRXZlbnQuU0VSVklDRV9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG9sZFByb3ZpZGVyKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbiNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uI3NldFNlcnZpY2VQcm92aWRlcihvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZSwgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2Ugc2VydmljZSwgSVNlcnZpY2VQcm92aWRlciBwcm92aWRlcikgewotCQlpZihwcm92aWRlciAhPSBudWxsICYmIHByb3ZpZGVyLmVxdWFscyhzZXJ2aWNlLmdldE51bGxQcm92aWRlcigpKSkKLQkJCXByb3ZpZGVyID0gbnVsbDsKLQkJCi0JCUlTZXJ2aWNlUHJvdmlkZXIgb2xkUHJvdmlkZXI7Ci0JCWlmKHByb3ZpZGVyID09IG51bGwpCi0JCQlvbGRQcm92aWRlciA9IGZTZXJ2aWNlVG9Qcm92aWRlck1hcC5yZW1vdmUoc2VydmljZSk7Ci0JCWVsc2UKLQkJCW9sZFByb3ZpZGVyID0gZlNlcnZpY2VUb1Byb3ZpZGVyTWFwLnB1dChzZXJ2aWNlLCBwcm92aWRlcik7Ci0JCQotCQlpZihvbGRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlhZGRGb3JtZXJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSwgb2xkUHJvdmlkZXIpOwotCQkJZkZvcm1lclNlcnZpY2VQcm92aWRlcnMuZ2V0KHNlcnZpY2UpLnJlbW92ZShwcm92aWRlcik7Ci0JCX0KLQkKLQkJZk1hbmFnZXIubm90aWZ5TGlzdGVuZXJzKG5ldyBTZXJ2aWNlTW9kZWxFdmVudCh0aGlzLCBJU2VydmljZU1vZGVsRXZlbnQuU0VSVklDRV9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG9sZFByb3ZpZGVyKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGFkZEZvcm1lclNlcnZpY2VQcm92aWRlcihJU2VydmljZSBzZXJ2aWNlLCBJU2VydmljZVByb3ZpZGVyIGRpc2FibGVkUHJvdmlkZXIpIHsKLQkJaWYoZGlzYWJsZWRQcm92aWRlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJTGlua2VkSGFzaFNldDxJU2VydmljZVByb3ZpZGVyPiBkaXNhYmxlZFNlcnZpY2VzID0gZkZvcm1lclNlcnZpY2VQcm92aWRlcnMuZ2V0KHNlcnZpY2UpOwotCQlpZihkaXNhYmxlZFNlcnZpY2VzID09IG51bGwpIHsKLQkJCWRpc2FibGVkU2VydmljZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJU2VydmljZVByb3ZpZGVyPigpOyAvLyB2ZXJ5IGltcG9ydGFudCB0byBtYWludGFpbiBpbnNlcnRpb24gb3JkZXIKLQkJCWZGb3JtZXJTZXJ2aWNlUHJvdmlkZXJzLnB1dChzZXJ2aWNlLCBkaXNhYmxlZFNlcnZpY2VzKTsKLQkJfQotCQlkaXNhYmxlZFNlcnZpY2VzLmFkZChkaXNhYmxlZFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2aWNlQ29uZmlndXJhdGlvbjogIiArIGZOYW1lICsgIiAtPiAiICsgZlNlcnZpY2VUb1Byb3ZpZGVyTWFwOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlKElTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc2V0U2VydmljZVByb3ZpZGVyKHNlcnZpY2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZWQoSVNlcnZpY2Ugc2VydmljZSkgewotCQlyZXR1cm4gIWZTZXJ2aWNlVG9Qcm92aWRlck1hcC5jb250YWluc0tleShzZXJ2aWNlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvY29yZS9TZXJ2aWNlTW9kZWxFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL2NvcmUvU2VydmljZU1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYjZhZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvY29yZS9TZXJ2aWNlTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZU1vZGVsRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCBpbXBsZW1lbnRzIElTZXJ2aWNlTW9kZWxFdmVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQlwcml2YXRlIElTZXJ2aWNlUHJvdmlkZXIgb2xkUHJvdmlkZXI7Ci0KLQlwdWJsaWMgU2VydmljZU1vZGVsRXZlbnQoT2JqZWN0IHNvdXJjZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU2VydmljZU1vZGVsRXZlbnQoT2JqZWN0IHNvdXJjZSwgaW50IHR5cGUsIElTZXJ2aWNlUHJvdmlkZXIgb2xkUHJvdmlkZXIpIHsKLQkJdGhpcyhzb3VyY2UsIHR5cGUpOwotCQl0aGlzLm9sZFByb3ZpZGVyID0gb2xkUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIElTZXJ2aWNlUHJvdmlkZXIgZ2V0T2xkUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBvbGRQcm92aWRlcjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvY29yZS9TZXJ2aWNlTW9kZWxFdmVudE1hbmFnZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2VNb2RlbEV2ZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE3MzM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2VNb2RlbEV2ZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbEV2ZW50TGlzdGVuZXI7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VNb2RlbEV2ZW50TWFuYWdlciB7Ci0JcHJpdmF0ZSBMaXN0PExpc3RlbmVyTGlzdD4gZkV2ZW50TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0ZW5lckxpc3Q+KCk7Ci0JCi0JcHVibGljIFNlcnZpY2VNb2RlbEV2ZW50TWFuYWdlcigpIHsKLQkJZm9yIChpbnQgaW5kZXggPSAxOyBpbmRleCA8PSBJU2VydmljZU1vZGVsRXZlbnQuQUxMX0VWRU5UUzsgaW5kZXggPDw9IDEpIHsKLQkJCWZFdmVudExpc3RlbmVycy5hZGQobmV3IExpc3RlbmVyTGlzdCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIGZvciBzZXJ2aWNlIG1vZGVsIGV2ZW50cy4gSGFzIG5vIGVmZmVjdCBpZiBhbiAKLQkgKiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiAKLQkgKiA8cD4KLQkgKiBMaXN0ZW5lcnMgY2FuIGxpc3RlbiBmb3Igc2V2ZXJhbCB0eXBlcyBvZiBldmVudCBhcyBkZWZpbmVkIGluCi0JICogPGNvZGU+SVNlcnZpY2VNb2RlbEV2ZW50PC9jb2RlPi4gQ2xpZW50cyBhcmUgZnJlZSB0byByZWdpc3RlciBmb3IKLQkgKiBhbnkgbnVtYmVyIG9mIGV2ZW50IHR5cGVzLiBDbGllbnRzIGFyZSBndWFyYW50ZWVkIHRvIG9ubHkgcmVjZWl2ZQotCSAqIGV2ZW50IHR5cGVzIGZvciB3aGljaCB0aGV5IGFyZSByZWdpc3RlcmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICogQHBhcmFtIGV2ZW50TWFzayB0aGUgYml0LXdpc2UgT1Igb2YgYWxsIGV2ZW50IHR5cGVzIG9mIGludGVyZXN0IHRvIHRoZQotCSAqIGxpc3RlbmVyCi0JICogQHNlZSBJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcgotCSAqIEBzZWUgSVNlcnZpY2VNb2RlbEV2ZW50Ci0JICogQHNlZSAjcmVtb3ZlRXZlbnRMaXN0ZW5lcihJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFdmVudExpc3RlbmVyKElTZXJ2aWNlTW9kZWxFdmVudExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgdHlwZSkgewotCQlmb3IgKGludCBpbmRleCA9IDEsIHBvcyA9IDA7IGluZGV4IDw9IElTZXJ2aWNlTW9kZWxFdmVudC5BTExfRVZFTlRTOyBpbmRleCA8PD0gMSwgcG9zKyspIHsKLQkJCWlmICgodHlwZSAmIGluZGV4KSA9PSBpbmRleCkgewotCQkJCUxpc3RlbmVyTGlzdCBsaXN0ID0gZkV2ZW50TGlzdGVuZXJzLmdldChwb3MpOwotCQkJCWlmIChsaXN0ICE9IG51bGwpIHsgCi0JCQkJCWxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhbiBldmVudCBvY2N1cnJlbmNlLiBPbmx5IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmljCi0JICogZXZlbnQgdHlwZSB3aWxsIGJlIG5vdGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBldmVudCB0byBub3RpZnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVNlcnZpY2VNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMSwgcG9zID0gMDsgaW5kZXggPD0gSVNlcnZpY2VNb2RlbEV2ZW50LkFMTF9FVkVOVFM7IGluZGV4IDw8PSAxLCBwb3MrKykgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBpbmRleCkgewotCQkJCUxpc3RlbmVyTGlzdCBsaXN0ID0gZkV2ZW50TGlzdGVuZXJzLmdldChwb3MpOwotCQkJCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCQkJZm9yIChPYmplY3Qgb2JqIDogbGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCQkJKChJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcilvYmopLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3Igc2VydmljZSBtb2RlbCBldmVudHMuIEhhcyBubyBlZmZlY3QgaWYgdGhlIAotCSAqIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLiAKLQkgKiA8cD4KLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICogQHNlZSBJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcgotCSAqIEBzZWUgSVNlcnZpY2VNb2RlbEV2ZW50Ci0JICogQHNlZSAjYWRkRXZlbnRMaXN0ZW5lcihJU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFdmVudExpc3RlbmVyKElTZXJ2aWNlTW9kZWxFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZvciAoTGlzdGVuZXJMaXN0IGxpc3QgOiBmRXZlbnRMaXN0ZW5lcnMpIHsKLQkJCWxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC9jb3JlL1NlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3NDI4My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvY29yZS9TZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQSBkZXNjcmlwdGlvbiAoYnV0IG5vdCBhbiBpbnN0YW5jZSkgb2YgYSBzZXJ2aWNlIHByb3ZpZGVyLgotICoKLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBvcgotICogdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nCi0gKiB3aXRoIHRoZSBSRFQgdGVhbS4KLSAqIAotICogQGF1dGhvciBncmVnCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIGZJZDsKLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmU2VydmljZUlkOwotCXByaXZhdGUgSW50ZWdlciBmUHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkKLQlwdWJsaWMgU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgc2VydmljZUlkLCBTdHJpbmcgcHJpb3JpdHkpIHsKLQkJZklkID0gaWQ7Ci0JCWZOYW1lID0gbmFtZTsKLQkJZlNlcnZpY2VJZCA9IHNlcnZpY2VJZDsKLQkJaWYgKHByaW9yaXR5ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZlByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludChwcmlvcml0eSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmSWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yI2dldFByaW9yaXR5KCkKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIGZQcmlvcml0eTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciNnZXRTZXJ2aWNlSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUlkKCkgewotCQlyZXR1cm4gZlNlcnZpY2VJZDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZklkLmVxdWFscygoKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yKSBvKS5nZXRJZCgpKTsgCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmSWQuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yKCIgKyBmSWQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QvLmNsYXNzcGF0aCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWMxNTYzMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJidWlsZCIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0Ly5wcm9qZWN0IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkNzA1Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjkxOTNmMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI0ZyaSBKdW4gMTIgMTI6MjE6NTYgRURUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ4ZmI5ZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogUFRQIFNlcnZpY2VzIFRlc3QgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Q7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDQ7YnVuZGxlLXZlcnNpb249IjQuMy4xIiwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWksCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iMy40LjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QuQWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QsCi0gb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QuaGFuZGxlcnMKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QvYnVpbGQucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY5N2ZiNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYnVpbGQvDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sDQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9wbHVnaW4ueG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDExNjkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5zZXJ2aWNlcyI+Ci0gICAgICA8c2VydmljZQotICAgICAgICAgICAgY2F0ZWdvcnlJZD0iQ2F0ZWdvcnkxIgotICAgICAgICAgICAgaWQ9IlNlcnZpY2VBIgotICAgICAgICAgICAgbmFtZT0iU2VydmljZUEiPgotICAgICAgPC9zZXJ2aWNlPgotICAgICAgPHNlcnZpY2UKLSAgICAgICAgICAgIGlkPSJTZXJ2aWNlQiIKLSAgICAgICAgICAgIG5hbWU9IlNlcnZpY2VCIgotICAgICAgICAgICAgbnVsbFByb3ZpZGVyQ2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0LlRlc3RTZXJ2aWNlUHJvdmlkZXIiPgotICAgICAgPC9zZXJ2aWNlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUucHJvdmlkZXJzIj4KLSAgICAgIDxwcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0LlRlc3RTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0iUHJvdmlkZXJBXzEiCi0gICAgICAgICAgICBuYW1lPSJQcm92aWRlckFfMSIKLSAgICAgICAgICAgIHByaW9yaXR5PSIxMDAiCi0gICAgICAgICAgICBzZXJ2aWNlSWQ9IlNlcnZpY2VBIj4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgICA8cHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC5UZXN0U2VydmljZVByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9IlByb3ZpZGVyQV8yIgotICAgICAgICAgICAgbmFtZT0iUHJvdmlkZXJBXzIiCi0gICAgICAgICAgICBwcmlvcml0eT0iMSIKLSAgICAgICAgICAgIHNlcnZpY2VJZD0iU2VydmljZUEiPgotICAgICAgPC9wcm92aWRlcj4KLSAgICAgIDxwcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0LlRlc3RTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0iUHJvdmlkZXJBXzMiCi0gICAgICAgICAgICBuYW1lPSJQcm92aWRlckFfMyIKLSAgICAgICAgICAgIHByaW9yaXR5PSIxIgotICAgICAgICAgICAgc2VydmljZUlkPSJTZXJ2aWNlQSI+Ci0gICAgICA8L3Byb3ZpZGVyPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QuVGVzdFNlcnZpY2VQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJQcm92aWRlckJfMSIKLSAgICAgICAgICAgIG5hbWU9IlByb3ZpZGVyQl8xIgotICAgICAgICAgICAgcHJpb3JpdHk9IjEiCi0gICAgICAgICAgICBzZXJ2aWNlSWQ9IlNlcnZpY2VCIj4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5zZXJ2aWNlQ2F0ZWdvcmllcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJDYXRlZ29yeTEiCi0gICAgICAgICAgICBuYW1lPSJDYXRlZ29yeTEiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9IkNhdGVnb3J5MiIKLSAgICAgICAgICAgIG5hbWU9IkNhdGVnb3J5MiI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLQotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS51aS5tYWluLm1lbnU/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLm1lbnVzLnNlcnZpY2VzTWVudSIKLSAgICAgICAgICAgICAgIGxhYmVsPSJTZXJ2aWNlcyIKLSAgICAgICAgICAgICAgIG1uZW1vbmljPSJNIj4KLSAgICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5jb21tYW5kcy5sYXVuY2hXaXphcmQiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLm1lbnVzLmxhdW5jaFdpemFyZCIKLSAgICAgICAgICAgICAgICAgIG1uZW1vbmljPSJTIj4KLSAgICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0LmNvbW1hbmRzLnByaW50U2VydmljZU1vZGVsIgotICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0Lm1lbnVzLnByaW50U2VydmljZU1vZGVsIgotICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotICAgICAgICAgICAgPC9jb21tYW5kPgotICAgICAgICAgPC9tZW51PgotICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLmNvbW1hbmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iU2VydmljZXMgQ2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuY29tbWFuZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLmNvbW1hbmRzLmxhdW5jaFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IkxhdW5jaCBXaXphcmQuLi4iPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5jb21tYW5kcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC5jb21tYW5kcy5wcmludFNlcnZpY2VNb2RlbCIKLSAgICAgICAgICAgIG5hbWU9IlByaW50IFNlcnZpY2UgTW9kZWwiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC5oYW5kbGVycy5MYXVuY2hXaXphcmRIYW5kbGVyIgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuY29tbWFuZHMubGF1bmNoV2l6YXJkIj4KLSAgICAgIDwvaGFuZGxlcj4KLSAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QuaGFuZGxlcnMuUHJpbnRTZXJ2aWNlTW9kZWxIYW5kbGVyIgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC5jb21tYW5kcy5wcmludFNlcnZpY2VNb2RlbCI+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdGVzdC9BY3RpdmF0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy90ZXN0L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU5ZTBiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy90ZXN0L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgb3IKLSAqIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZwotICogd2l0aCB0aGUgUkRUIHRlYW0uCi0gKiAKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJFcnJvciIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9nRXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgbnVsbCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3Rlc3QvU2VydmljZU1vZGVsTWFuYWdlclRlc3RzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdGVzdC9TZXJ2aWNlTW9kZWxNYW5hZ2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzI1NjYzNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdGVzdC9TZXJ2aWNlTW9kZWxNYW5hZ2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmUuU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLS8qKgotICogTm90ZSwgeW91IG5lZWQgdG8gcnVuIHRoaXMgd2l0aG91dCBhbnkgb3RoZXIgcGx1Z2lucyB0aGF0Ci0gKiBjb250cmlidXRlIHRvIHRoZSBzZXJ2aWNlIG1vZGVsLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VNb2RlbE1hbmFnZXJUZXN0cyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCi0JCVNFUlZJQ0VfQSA9ICJTZXJ2aWNlQSIsCi0JCVNFUlZJQ0VfQiA9ICJTZXJ2aWNlQiI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCi0JCVBST1ZJREVSX0FfMSA9ICJQcm92aWRlckFfMSIsCi0JCVBST1ZJREVSX0FfMiA9ICJQcm92aWRlckFfMiIsCi0JCVBST1ZJREVSX0FfMyA9ICJQcm92aWRlckFfMyIsCi0JCVBST1ZJREVSX0JfMSA9ICJQcm92aWRlckJfMSI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCi0JCUNBVEVHT1JZXzEgPSAiQ2F0ZWdvcnkxIiwKLQkJQ0FURUdPUllfMiA9ICJDYXRlZ29yeTIiOwotCQotCQotCUlQcm9qZWN0IGZQcm9qZWN0OwotCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBmQ29uZmlnOwotCUlTZXJ2aWNlIGZTZXJ2aWNlMTsKLQlJU2VydmljZSBmU2VydmljZTI7Ci0JCi0Jdm9pZCBwZXJzaXN0QW5kUmVwbGFjZU1vZGVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgic2VydmljZU1vZGVsVGVzdCIsICIudHh0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJU2VydmljZU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQkKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7Ci0JCXRyeSB7Ci0JCQltYW5hZ2VyLnNhdmVNb2RlbENvbmZpZ3VyYXRpb24od3JpdGVyKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9Ci0JCQotCQlSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLQkJdHJ5IHsKLQkJCW1hbmFnZXIubG9hZE1vZGVsQ29uZmlndXJhdGlvbihyZWFkZXIpOwotCQl9IGZpbmFsbHkgewotCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JSVNlcnZpY2VQcm92aWRlciBhZGRQcm92aWRlcihTdHJpbmcgcHJvdmlkZXJJZCwgSVNlcnZpY2Ugc2VydmljZSwgSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJU2VydmljZU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQlJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gc2VydmljZS5nZXRQcm92aWRlckRlc2NyaXB0b3IocHJvdmlkZXJJZCk7Ci0JCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIgPSBtYW5hZ2VyLmdldFNlcnZpY2VQcm92aWRlcihkZXNjcmlwdG9yKTsKLQkJY29uZmlnLnNldFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlLCBwcm92aWRlcik7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJ0ZXN0UHJvamVjdCIpOwotCQlmUHJvamVjdC5jcmVhdGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWZDb25maWcgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkubmV3U2VydmljZUNvbmZpZ3VyYXRpb24oIm15Y29uZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZQcm9qZWN0LmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJU2VydmljZU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQkKLQkJZlNlcnZpY2UxID0gbWFuYWdlci5nZXRTZXJ2aWNlKFNFUlZJQ0VfQSk7IAotCQlhZGRQcm92aWRlcihQUk9WSURFUl9BXzEsIGZTZXJ2aWNlMSwgZkNvbmZpZyk7IAotCQlmU2VydmljZTIgPSBtYW5hZ2VyLmdldFNlcnZpY2UoU0VSVklDRV9CKTsgCi0JCWFkZFByb3ZpZGVyKFBST1ZJREVSX0JfMSwgZlNlcnZpY2UyLCBmQ29uZmlnKTsgCi0KLQkJbWFuYWdlci5hZGRDb25maWd1cmF0aW9uKGZQcm9qZWN0LCBmQ29uZmlnKTsKLQkJCi0JCXBlcnNpc3RBbmRSZXBsYWNlTW9kZWwoKTsKLQkJCi0JCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSBtYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oZlByb2plY3QsIGZDb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShmQ29uZmlnLCBjb25maWcpOwotCQlTZXQ8SVNlcnZpY2U+IHNlcnZpY2VzID0gZkNvbmZpZy5nZXRTZXJ2aWNlcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgc2VydmljZXMuc2l6ZSgpKTsKLQkJZm9yIChJU2VydmljZSBzZXJ2aWNlIDogc2VydmljZXMpIHsKLQkJCWlmIChzZXJ2aWNlLmdldElkKCkuZXF1YWxzKGZTZXJ2aWNlMS5nZXRJZCgpKSkgewotCQkJCWFzc2VydFNlcnZpY2VzRXF1YWxzKGZTZXJ2aWNlMSwgc2VydmljZSwgZkNvbmZpZywgY29uZmlnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0U2VydmljZXNFcXVhbHMoZlNlcnZpY2UyLCBzZXJ2aWNlLCBmQ29uZmlnLCBjb25maWcpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0U2VydmljZXNFcXVhbHMoSVNlcnZpY2UgZXhwZWN0ZWQsIElTZXJ2aWNlIGFjdHVhbCwgSVNlcnZpY2VDb25maWd1cmF0aW9uIGV4cGVjdGVkQ29uZmlnLCBJU2VydmljZUNvbmZpZ3VyYXRpb24gYWN0dWFsQ29uZmlnKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRJZCgpLCBhY3R1YWwuZ2V0SWQoKSk7Ci0JCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIgPSBleHBlY3RlZENvbmZpZy5nZXRTZXJ2aWNlUHJvdmlkZXIoYWN0dWFsKTsKLQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlcjIgPSBhY3R1YWxDb25maWcuZ2V0U2VydmljZVByb3ZpZGVyKGFjdHVhbCk7Ci0JCWFzc2VydEVxdWFscyhwcm92aWRlci5nZXRJZCgpLCBwcm92aWRlcjIuZ2V0SWQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0T25lUHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVNlcnZpY2VNb2RlbE1hbmFnZXIgbWFuYWdlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCWZTZXJ2aWNlMSA9IG1hbmFnZXIuZ2V0U2VydmljZShTRVJWSUNFX0EpOyAKLQkJYWRkUHJvdmlkZXIoUFJPVklERVJfQV8yLCBmU2VydmljZTEsIGZDb25maWcpOyAKLQkJbWFuYWdlci5hZGRDb25maWd1cmF0aW9uKGZQcm9qZWN0LCBmQ29uZmlnKTsKLQkJCi0JCXBlcnNpc3RBbmRSZXBsYWNlTW9kZWwoKTsKLQkJCi0JCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSBtYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oZlByb2plY3QsIGZDb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShmQ29uZmlnLCBjb25maWcpOwotCQlTZXQ8SVNlcnZpY2U+IHNlcnZpY2VzID0gZkNvbmZpZy5nZXRTZXJ2aWNlcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgc2VydmljZXMuc2l6ZSgpKTsKLQkJSVNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRTZXJ2aWNlc0VxdWFscyhmU2VydmljZTEsIHNlcnZpY2UsIGZDb25maWcsIGNvbmZpZyk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEZvcm1lclByb3ZpZGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlJU2VydmljZU1vZGVsTWFuYWdlciBzbW0gPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZyA9IChTZXJ2aWNlQ29uZmlndXJhdGlvbikgc21tLm5ld1NlcnZpY2VDb25maWd1cmF0aW9uKCJibGFoIik7Ci0JCQotCQlmU2VydmljZTEgPSBzbW0uZ2V0U2VydmljZShTRVJWSUNFX0EpOyAKLQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlcjEgPSBhZGRQcm92aWRlcihQUk9WSURFUl9BXzEsIGZTZXJ2aWNlMSwgY29uZmlnKTsgCi0JCXByb3ZpZGVyMS5wdXRTdHJpbmcoImtleTEiLCAidmFsMSIpOwotCQlwcm92aWRlcjEucHV0U3RyaW5nKCJrZXkyIiwgInZhbDIiKTsKLQkJCi0JCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIyID0gYWRkUHJvdmlkZXIoUFJPVklERVJfQV8yLCBmU2VydmljZTEsIGNvbmZpZyk7IAotCQlwcm92aWRlcjIucHV0U3RyaW5nKCJrZXkxIiwgInZhbDFfMiIpOwotCQkKLQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlcjMgPSBhZGRQcm92aWRlcihQUk9WSURFUl9BXzMsIGZTZXJ2aWNlMSwgY29uZmlnKTsgCi0JCXByb3ZpZGVyMy5wdXRTdHJpbmcoImtleTEiLCAicHJvdmlkZXIzIik7Ci0JCQotCQkKLQkJcGVyc2lzdEFuZFJlcGxhY2VNb2RlbCgpOwotCQkKLQkJCi0JCVNldDxJU2VydmljZVByb3ZpZGVyPiBwcm92aWRlcnMgPSBjb25maWcuZ2V0Rm9ybWVyU2VydmljZVByb3ZpZGVycyhmU2VydmljZTEpOwotCQlhc3NlcnROb3ROdWxsKHByb3ZpZGVycyk7Ci0JCWFzc2VydEVxdWFscygyLCBwcm92aWRlcnMuc2l6ZSgpKTsKLQkJSXRlcmF0b3I8SVNlcnZpY2VQcm92aWRlcj4gaXRlciA9IHByb3ZpZGVycy5pdGVyYXRvcigpOwotCQkKLQkJSVNlcnZpY2VQcm92aWRlciBkaXNhYmxlZFByb3ZpZGVyID0gaXRlci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhQUk9WSURFUl9BXzEsIGRpc2FibGVkUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsMSIsIGRpc2FibGVkUHJvdmlkZXIuZ2V0U3RyaW5nKCJrZXkxIiwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbDIiLCBkaXNhYmxlZFByb3ZpZGVyLmdldFN0cmluZygia2V5MiIsIG51bGwpKTsKLQkJCi0JCWRpc2FibGVkUHJvdmlkZXIgPSBpdGVyLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFBST1ZJREVSX0FfMiwgZGlzYWJsZWRQcm92aWRlci5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWwxXzIiLCBkaXNhYmxlZFByb3ZpZGVyLmdldFN0cmluZygia2V5MSIsIG51bGwpKTsKLQkJCi0JCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIgPSBjb25maWcuZ2V0U2VydmljZVByb3ZpZGVyKGZTZXJ2aWNlMSk7Ci0JCWFzc2VydEVxdWFscyhQUk9WSURFUl9BXzMsIHByb3ZpZGVyLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb3ZpZGVyMyIsIHByb3ZpZGVyLmdldFN0cmluZygia2V5MSIsIG51bGwpKTsKLQkJCi0JCQotCQlhZGRQcm92aWRlcihQUk9WSURFUl9BXzEsIGZTZXJ2aWNlMSwgY29uZmlnKTsKLQkJCi0JCQotCQlwcm92aWRlcnMgPSBjb25maWcuZ2V0Rm9ybWVyU2VydmljZVByb3ZpZGVycyhmU2VydmljZTEpOwotCQlhc3NlcnROb3ROdWxsKHByb3ZpZGVycyk7Ci0JCWFzc2VydEVxdWFscygyLCBwcm92aWRlcnMuc2l6ZSgpKTsKLQkJaXRlciA9IHByb3ZpZGVycy5pdGVyYXRvcigpOwotCQkKLQkJZGlzYWJsZWRQcm92aWRlciA9IGl0ZXIubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUFJPVklERVJfQV8yLCBkaXNhYmxlZFByb3ZpZGVyLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbDFfMiIsIGRpc2FibGVkUHJvdmlkZXIuZ2V0U3RyaW5nKCJrZXkxIiwgbnVsbCkpOwotCQkKLQkJZGlzYWJsZWRQcm92aWRlciA9IGl0ZXIubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUFJPVklERVJfQV8zLCBkaXNhYmxlZFByb3ZpZGVyLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb3ZpZGVyMyIsIGRpc2FibGVkUHJvdmlkZXIuZ2V0U3RyaW5nKCJrZXkxIiwgbnVsbCkpOwotCQkKLQkJCi0JCWNvbmZpZy5kaXNhYmxlKGZTZXJ2aWNlMSk7Ci0JCWFzc2VydEVxdWFscygwLCBjb25maWcuZ2V0U2VydmljZXMoKS5zaXplKCkpOwotCQkKLQkJLy8gc2hvdWxkIHN0aWxsIHJlbWVtYmVyIHRoZSBmb3JtZXIgcHJvdmlkZXJzIGV2ZW4gaWYgdGhlIHNlcnZpY2UgaXMgZGlzYWJsZWQKLQkJcHJvdmlkZXJzID0gY29uZmlnLmdldEZvcm1lclNlcnZpY2VQcm92aWRlcnMoZlNlcnZpY2UxKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm92aWRlcnMpOwotCQlhc3NlcnRFcXVhbHMoMywgcHJvdmlkZXJzLnNpemUoKSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlcnZpY2VDYXRlZ29yaWVzKCkgewotCQlTZXQ8SVNlcnZpY2VDYXRlZ29yeT4gY2F0ZWdvcmllcyA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDYXRlZ29yaWVzKCk7Ci0JCWFzc2VydE5vdE51bGwoY2F0ZWdvcmllcyk7Ci0JCWFzc2VydEVxdWFscygyLCBjYXRlZ29yaWVzLnNpemUoKSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxQcm92aWRlcigpIHsKLQkJU2VydmljZU1vZGVsTWFuYWdlciBzbW0gPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCUlTZXJ2aWNlIHNlcnZpY2VBID0gc21tLmdldFNlcnZpY2UoU0VSVklDRV9BKTsKLQkJSVNlcnZpY2Ugc2VydmljZUIgPSBzbW0uZ2V0U2VydmljZShTRVJWSUNFX0IpOwotCQlJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gc21tLm5ld1NlcnZpY2VDb25maWd1cmF0aW9uKCJibGFoIik7Ci0JCWNvbmZpZy5zZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZUEsIG51bGwpOwotCQljb25maWcuc2V0U2VydmljZVByb3ZpZGVyKHNlcnZpY2VCLCBudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoY29uZmlnLmdldFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlQSkpOwotCQlhc3NlcnROb3ROdWxsKGNvbmZpZy5nZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZUIpKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3Rlc3QvVGVzdFNlcnZpY2VQcm92aWRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3Rlc3QvVGVzdFNlcnZpY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmVmN2Q5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy90ZXN0L1Rlc3RTZXJ2aWNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2VQcm92aWRlciBleHRlbmRzIFNlcnZpY2VQcm92aWRlciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3Rlc3QvaGFuZGxlcnMvTGF1bmNoV2l6YXJkSGFuZGxlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3Rlc3QvaGFuZGxlcnMvTGF1bmNoV2l6YXJkSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZjNzMwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy90ZXN0L2hhbmRsZXJzL0xhdW5jaFdpemFyZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkud2l6YXJkcy5TZXJ2aWNlQ29uZmlndXJhdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIExhdW5jaFdpemFyZEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTGF1bmNoV2l6YXJkSGFuZGxlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZCwgc28gZXh0cmFjdCBleHRyYWN0IHRoZSBuZWVkZWQgaW5mb3JtYXRpb24KLQkgKiBmcm9tIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChldmVudCk7Ci0JCVNlcnZpY2VDb25maWd1cmF0aW9uV2lkZ2V0IHdpemFyZCA9IG5ldyBTZXJ2aWNlQ29uZmlndXJhdGlvbldpZGdldChTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoKSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdGVzdC9oYW5kbGVycy9QcmludFNlcnZpY2VNb2RlbEhhbmRsZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy90ZXN0L2hhbmRsZXJzL1ByaW50U2VydmljZU1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTcwOGQ3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy90ZXN0L2hhbmRsZXJzL1ByaW50U2VydmljZU1vZGVsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgUHJpbnRTZXJ2aWNlTW9kZWxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcmludFNlcnZpY2VNb2RlbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS8uY2xhc3NwYXRoIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLy5wcm9qZWN0IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTZiZTUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWJiNWMxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI0ZyaSBKdW4gMDUgMTg6NDI6MTcgRURUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBlOTQ5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5TZXJ2aWNlc1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWksCi0gb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLm1lc3NhZ2VzLAotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS53aWRnZXRzLAotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS53aXphcmRzCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9hYm91dC5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwYzkxMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvaWNvbnMvZXRvb2wxNi9uZXdfaHBjX3Byb2ouZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvaWNvbnMvZXRvb2wxNi9uZXdfaHBjX3Byb2ouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzBkNThkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL2ljb25zL2V0b29sMTYvbmV3X2hwY19wcm9qLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL2ljb25zL2V0b29sMTYvc2VydmljZS1jYXRlZ29yeS5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9pY29ucy9ldG9vbDE2L3NlcnZpY2UtY2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdjNDg1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL2ljb25zL2V0b29sMTYvc2VydmljZS1jYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9pY29ucy9ldG9vbDE2L3NlcnZpY2UtZGlzYWJsZWQuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvaWNvbnMvZXRvb2wxNi9zZXJ2aWNlLWRpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4NmE0Yi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9pY29ucy9ldG9vbDE2L3NlcnZpY2UtZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvaWNvbnMvZXRvb2wxNi9zZXJ2aWNlLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL2ljb25zL2V0b29sMTYvc2VydmljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODRmYmEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvaWNvbnMvZXRvb2wxNi9zZXJ2aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjQ3OGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5wdHAucmR0LnNlcnZpY2VzCi1CdW5kbGUtVmVuZG9yLjAgPSBlY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFBUUCBTZXJ2aWNlcyBNb2RlbCBVSSBQbHVnLWluCi0KLVNlcnZpY2VzVmlld0NhdGVnb3J5Lm5hbWUgPSBTZXJ2aWNlcwotU2VydmljZUNvbmZpZ3VyYXRpb25WaWV3Lm5hbWUgPSBTZXJ2aWNlIENvbmZpZ3VyYXRpb25zCi1BZGRTZXJ2aWNlQ29uZmlndXJhdGlvbi5sYWJlbCA9IEFkZC4uLgotRWRpdFNlcnZpY2VDb25maWd1cmF0aW9uLmxhYmVsID0gRWRpdAotUmVtb3ZlU2VydmljZUNvbmZpZ3VyYXRpb24ubGFiZWwgPSBSZW1vdmUKLVNldEFjdGl2ZVNlcnZpY2VDb25maWd1cmF0aW9uLmxhYmVsID0gU2V0IEFjdGl2ZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvcGx1Z2luLnhtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2U1NjkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb3ZpZGVyQ29udHJpYnV0b3JzIiBuYW1lPSJTZXJ2aWNlIFByb3ZpZGVyIENvbnRyaWJ1dG9ycyIgc2NoZW1hPSJzY2hlbWEvcHJvdmlkZXJDb250cmlidXRvcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmljZUNvbnRyaWJ1dG9ycyIgbmFtZT0iU2VydmljZSBDb250cmlidXRvcnMiIHNjaGVtYT0ic2NoZW1hL3NlcnZpY2VDb250cmlidXRvcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2l6YXJkRXh0ZW5zaW9ucyIgbmFtZT0iU2VydmljZSBDb25maWd1cmF0aW9uIFdpemFyZCBFeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS93aXphcmRFeHRlbnNpb25zLmV4c2QiLz4KLSAgIDxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotCQluYW1lPSIlU2VydmljZXNWaWV3Q2F0ZWdvcnkubmFtZSIKLQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS52aWV3cyI+Ci0JIDwvY2F0ZWdvcnk+Ci0gIAkgPHZpZXcKLSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS52aWV3cyIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS52aWV3cy5TZXJ2aWNlQ29uZmlndXJhdGlvblZpZXciCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkudmlld3Muc2VydmljZUNvbmZpZ3VyYXRpb25WaWV3IgotICAgICAgICBuYW1lPSIlU2VydmljZUNvbmZpZ3VyYXRpb25WaWV3Lm5hbWUiPgotICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLlNlcnZpY2VDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgbmFtZT0iU2VydmljZSBDb25maWd1cmF0aW9ucyI+Ci0gICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMucHRwUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5wcmVmZXJlbmNlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2UiCi0gICAgICAgICAgICBuYW1lPSJTZXJ2aWNlIENvbmZpZ3VyYXRpb24iPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLnVpLmFkYXB0ZXJzLlNlcnZpY2VNb2RlbFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciI+Ci0gICAgICAgICA8L2FkYXB0ZXI+Ci0gICAgICAgICA8YWRhcHRlcgotICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIyIj4KLSAgICAgICAgIDwvYWRhcHRlcj4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5pbnRlcm5hbC51aS5hZGFwdGVycy5TZXJ2aWNlTW9kZWxXb3JrYmVuY2hBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8YWRhcHRlcgotICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIiPgotICAgICAgICAgPC9hZGFwdGVyPgotICAgICAgICAgPGFkYXB0ZXIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyMiI+Ci0gICAgICAgICA8L2FkYXB0ZXI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLnVpLmFkYXB0ZXJzLlNlcnZpY2VNb2RlbFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciI+Ci0gICAgICAgICA8L2FkYXB0ZXI+Ci0gICAgICAgICA8YWRhcHRlcgotICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIyIj4KLSAgICAgICAgIDwvYWRhcHRlcj4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWRhcHRlcnMuU2VydmljZU1vZGVsV29ya2JlbmNoQWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGFkYXB0ZXIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyIj4KLSAgICAgICAgIDwvYWRhcHRlcj4KLSAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjIiPgotICAgICAgICAgPC9hZGFwdGVyPgotICAgICAgPC9mYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5zZXJ2aWNlQ29uZmlndXJhdGlvbi5wb3B1cE1lbnUiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWN0aW9ucy5FZGl0U2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5hY3Rpb25zLmVkaXRTZXJ2aWNlQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlRWRpdFNlcnZpY2VDb25maWd1cmF0aW9uLmxhYmVsIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5pbnRlcm5hbC51aS5hY3Rpb25zLlJlbW92ZVNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuYWN0aW9ucy5yZW1vdmVTZXJ2aWNlQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlUmVtb3ZlU2VydmljZUNvbmZpZ3VyYXRpb24ubGFiZWwiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLnVpLmFjdGlvbnMuU2VsZWN0QWN0aXZlU2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5hY3Rpb25zLnNlbGVjdEFjdGl2ZVNlcnZpY2VDb25maWd1cmF0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZXRBY3RpdmVTZXJ2aWNlQ29uZmlndXJhdGlvbi5sYWJlbCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPHZpZXdlckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5zZXJ2aWNlQ29uZmlndXJhdGlvbi5wb3B1cE1lbnUyIgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS52aWV3cy5zZXJ2aWNlQ29uZmlndXJhdGlvblZpZXciPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5pbnRlcm5hbC51aS5hY3Rpb25zLkFkZFNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuYWN0aW9ucy5hZGRTZXJ2aWNlQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkU2VydmljZUNvbmZpZ3VyYXRpb24ubGFiZWwiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zY2hlbWEvcHJvdmlkZXJDb250cmlidXRvcnMuZXhzZCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NjaGVtYS9wcm92aWRlckNvbnRyaWJ1dG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTYwNGNmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NjaGVtYS9wcm92aWRlckNvbnRyaWJ1dG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkiIGlkPSJwcm92aWRlckNvbmZpZ3VyYXRpb25zIiBuYW1lPSJTZXJ2aWNlIFByb3ZpZGVyIENvbmZpZ3VyYXRpb24gVUlzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBzcGVjaWZ5IGNvbmZpZ3VyYXRpb24gVUlzIGZvciBzZXJ2aWNlIHByb3ZpZGVycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3ZpZGVyQ29udHJpYnV0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvdmlkZXJDb250cmlidXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgc2VydmljZSBwcm92aWRlciBtYWtpbmcgdGhpcyBjb250cmlidXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyBpbXBsZW1lbnRpbmcgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmZpZ3VyYXRpb25VSUNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zY2hlbWEvc2VydmljZUNvbnRyaWJ1dG9ycy5leHNkIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc2NoZW1hL3NlcnZpY2VDb250cmlidXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiMWQwNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zY2hlbWEvc2VydmljZUNvbnRyaWJ1dG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkiIGlkPSJzZXJ2aWNlQ29udHJpYnV0aW9ucyIgbmFtZT0iU2VydmljZSBDb250cmlidXRpb25zIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2aWNlQ29udHJpYnV0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VydmljZUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIElEIG9mIHRoZSBzZXJ2aWNlIG1ha2luZyB0aGlzIFVJIGNvbnJpYnV0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZUNvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuSVNlcnZpY2VDb250cmlidXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc2NoZW1hL3dpemFyZEV4dGVuc2lvbnMuZXhzZCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NjaGVtYS93aXphcmRFeHRlbnNpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzBhNzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc2NoZW1hL3dpemFyZEV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpIiBpZD0id2l6YXJkRXh0ZW5zaW9ucyIgbmFtZT0iU2VydmljZSBDb25maWd1cmF0aW9uIFdpemFyZCBFeHRlbnNpb25zIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRFeHRlbnNpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkRXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWN0aW9ucy9BZGRTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hY3Rpb25zL0FkZFNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzRiZjQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hY3Rpb25zL0FkZFNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgY2xhc3MgQWRkU2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQkKLQlwcml2YXRlIElTZXJ2aWNlTW9kZWxNYW5hZ2VyIGZNYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgSVNlcnZpY2VDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uID0gbnVsbDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3RTZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQlpZiAoc3RydWN0U2VsLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWQgPSBzdHJ1Y3RTZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBJU2VydmljZUNvbmZpZ3VyYXRpb24pIHsKLQkJCQlmQ29uZmlndXJhdGlvbiA9IChJU2VydmljZUNvbmZpZ3VyYXRpb24pc2VsZWN0ZWQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBOb3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWN0aW9ucy9FZGl0U2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWN0aW9ucy9FZGl0U2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2YTk4Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL3VpL2FjdGlvbnMvRWRpdFNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGNsYXNzIEVkaXRTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JCi0JcHJpdmF0ZSBJU2VydmljZU1vZGVsTWFuYWdlciBmTWFuYWdlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBmQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0U2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJaWYgKHN0cnVjdFNlbC5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IHNlbGVjdGVkID0gc3RydWN0U2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSVNlcnZpY2VDb25maWd1cmF0aW9uKSB7Ci0JCQkJZkNvbmZpZ3VyYXRpb24gPSAoSVNlcnZpY2VDb25maWd1cmF0aW9uKXNlbGVjdGVkOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gTm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZW1vdmVTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hY3Rpb25zL1JlbW92ZVNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDFmZjguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hY3Rpb25zL1JlbW92ZVNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGNsYXNzIFJlbW92ZVNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkKLQlwcml2YXRlIElTZXJ2aWNlTW9kZWxNYW5hZ2VyIGZNYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgTGlzdDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGZDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZpY2VDb25maWd1cmF0aW9uPigpOwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZldvcmtiZW5jaFBhcnQ7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlTdHJpbmcgbmFtZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGZDb25maWd1cmF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJbmFtZXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbmFtZXMgKz0gIlxuXHQiICsgZkNvbmZpZ3VyYXRpb25zLmdldChpKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJYm9vbGVhbiByZW1vdmUgPSBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKGZXb3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCU1lc3NhZ2VzLlJlbW92ZVNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uXzAsCi0JCQkJTWVzc2FnZXMuUmVtb3ZlU2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb25fMQotCQkJCSsgbmFtZXMpOwotCQkKLQkJaWYgKHJlbW92ZSkgewotCQkJZm9yIChJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZiA6IGZDb25maWd1cmF0aW9ucykgewotCQkJCWZNYW5hZ2VyLnJlbW92ZShjb25mKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZkNvbmZpZ3VyYXRpb25zLmNsZWFyKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCWZvciAoT2JqZWN0IHNlbGVjdGVkIDogc3RydWN0U2VsLnRvQXJyYXkoKSkgewotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSVNlcnZpY2VDb25maWd1cmF0aW9uKSB7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zLmFkZCgoSVNlcnZpY2VDb25maWd1cmF0aW9uKXNlbGVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCWZXb3JrYmVuY2hQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL3VpL2FjdGlvbnMvU2VsZWN0QWN0aXZlU2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWN0aW9ucy9TZWxlY3RBY3RpdmVTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGE3YTRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWN0aW9ucy9TZWxlY3RBY3RpdmVTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RBY3RpdmVTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JCi0JcHJpdmF0ZSBJU2VydmljZU1vZGVsTWFuYWdlciBmTWFuYWdlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBmQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlmTWFuYWdlci5zZXRBY3RpdmVDb25maWd1cmF0aW9uKGZDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCWlmIChzdHJ1Y3RTZWwuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBzZWxlY3RlZCA9IHN0cnVjdFNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElTZXJ2aWNlQ29uZmlndXJhdGlvbikgewotCQkJCWZDb25maWd1cmF0aW9uID0gKElTZXJ2aWNlQ29uZmlndXJhdGlvbilzZWxlY3RlZDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIE5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL3VpL2FkYXB0ZXJzL1NlcnZpY2VDb25maWd1cmF0aW9uV29ya2JlbmNoQWRhcHRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hZGFwdGVycy9TZXJ2aWNlQ29uZmlndXJhdGlvbldvcmtiZW5jaEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlNDNhYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL3VpL2FkYXB0ZXJzL1NlcnZpY2VDb25maWd1cmF0aW9uV29ya2JlbmNoQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLnVpLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VDb25maWd1cmF0aW9uV29ya2JlbmNoQWRhcHRlciBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZiA9IGdldFNlcnZpY2VDb25maWd1cmF0aW9uKHBhcmVudEVsZW1lbnQpOwotCQlpZiAoY29uZiAhPSBudWxsKSB7Ci0JCQlTZXQ8SVNlcnZpY2VQcm92aWRlcj4gcHJvdmlkZXJzID0gbmV3IEhhc2hTZXQ8SVNlcnZpY2VQcm92aWRlcj4oKTsKLQkJCWZvciAoSVNlcnZpY2Ugc2VydmljZSA6IGNvbmYuZ2V0U2VydmljZXMoKSkgewotCQkJCXByb3ZpZGVycy5hZGQoY29uZi5nZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSkpOwotCQkJfQotCQkJcmV0dXJuIHByb3ZpZGVycy50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU2VydmljZUNvbmZpZ3VyYXRpb24gZ2V0U2VydmljZUNvbmZpZ3VyYXRpb24oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmYgPSBudWxsOwotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCWNvbmYgPSAoSVNlcnZpY2VDb25maWd1cmF0aW9uKSAoKElBZGFwdGFibGUpIHBhcmVudEVsZW1lbnQpLmdldEFkYXB0ZXIoSVNlcnZpY2VDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gY29uZjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWZpbmFsIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25mID0gKElTZXJ2aWNlQ29uZmlndXJhdGlvbikgb2JqZWN0OwotCQlyZXR1cm4gY29uZi5nZXROYW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWRhcHRlcnMvU2VydmljZU1vZGVsV29ya2JlbmNoQWRhcHRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hZGFwdGVycy9TZXJ2aWNlTW9kZWxXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjg4YWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hZGFwdGVycy9TZXJ2aWNlTW9kZWxXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZU1vZGVsV29ya2JlbmNoQWRhcHRlciBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gKChJU2VydmljZU1vZGVsTWFuYWdlcilwYXJlbnRFbGVtZW50KS5nZXRDb25maWd1cmF0aW9ucygpLnRvQXJyYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL3VpL2FkYXB0ZXJzL1NlcnZpY2VNb2RlbFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL3VpL2FkYXB0ZXJzL1NlcnZpY2VNb2RlbFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZmMxMDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hZGFwdGVycy9TZXJ2aWNlTW9kZWxXb3JrYmVuY2hBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLnVpLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjI7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTW9kZWxXb3JrYmVuY2hBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXJ2aWNlTW9kZWxXb3JrYmVuY2hBZGFwdGVyIFNFUlZJQ0VfTU9ERUxfV09SS0JFTkNIX0FEQVBURVIgPQotCQluZXcgU2VydmljZU1vZGVsV29ya2JlbmNoQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlcnZpY2VDb25maWd1cmF0aW9uV29ya2JlbmNoQWRhcHRlciBTRVJWSUNFX0NPTkZJR1VSQVRJT05fV09SS0JFTkNIX0FEQVBURVIgPQotCQluZXcgU2VydmljZUNvbmZpZ3VyYXRpb25Xb3JrYmVuY2hBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VydmljZVByb3ZpZGVyV29ya2JlbmNoQWRhcHRlciBTRVJWSUNFX1BST1ZJREVSX1dPUktCRU5DSF9BREFQVEVSID0KLQkJbmV3IFNlcnZpY2VQcm92aWRlcldvcmtiZW5jaEFkYXB0ZXIoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXJ2aWNlV29ya2JlbmNoQWRhcHRlciBTRVJWSUNFX1dPUktCRU5DSF9BREFQVEVSID0KLQkJbmV3IFNlcnZpY2VXb3JrYmVuY2hBZGFwdGVyKCk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzIHx8IGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyMi5jbGFzcykgewotCQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElTZXJ2aWNlTW9kZWxNYW5hZ2VyKSB7Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfTU9ERUxfV09SS0JFTkNIX0FEQVBURVI7Ci0JCQl9Ci0JCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2VDb25maWd1cmF0aW9uKSB7Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfQ09ORklHVVJBVElPTl9XT1JLQkVOQ0hfQURBUFRFUjsKLQkJCX0KLQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJU2VydmljZVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfUFJPVklERVJfV09SS0JFTkNIX0FEQVBURVI7Ci0JCQl9Ci0JCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2UpIHsKLQkJCQlyZXR1cm4gU0VSVklDRV9XT1JLQkVOQ0hfQURBUFRFUjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHtJV29ya2JlbmNoQWRhcHRlci5jbGFzcywgSVdvcmtiZW5jaEFkYXB0ZXIyLmNsYXNzfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWRhcHRlcnMvU2VydmljZVByb3ZpZGVyV29ya2JlbmNoQWRhcHRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hZGFwdGVycy9TZXJ2aWNlUHJvdmlkZXJXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDFiYmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy9pbnRlcm5hbC91aS9hZGFwdGVycy9TZXJ2aWNlUHJvdmlkZXJXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5TZXJ2aWNlTW9kZWxJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcm92aWRlcldvcmtiZW5jaEFkYXB0ZXIgZXh0ZW5kcyBXb3JrYmVuY2hBZGFwdGVyIHsKLQlwcml2YXRlIElTZXJ2aWNlTW9kZWxNYW5hZ2VyIGZNYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBTZXJ2aWNlTW9kZWxJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNlcnZpY2VNb2RlbEltYWdlcy5JTUdfU0VSVklDRSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmplY3QpIHsKLQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IChJU2VydmljZVByb3ZpZGVyKW9iamVjdDsKLQkJSVNlcnZpY2Ugc2VydmljZSA9IGZNYW5hZ2VyLmdldFNlcnZpY2UocHJvdmlkZXIuZ2V0U2VydmljZUlkKCkpOwotCQlyZXR1cm4gc2VydmljZS5nZXROYW1lKCkgKyAiIFNlcnZpY2UgKCIgKyBwcm92aWRlci5nZXROYW1lKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWRhcHRlcnMvU2VydmljZVdvcmtiZW5jaEFkYXB0ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvaW50ZXJuYWwvdWkvYWRhcHRlcnMvU2VydmljZVdvcmtiZW5jaEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmOTE4ZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL2ludGVybmFsL3VpL2FkYXB0ZXJzL1NlcnZpY2VXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuaW50ZXJuYWwudWkuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLlNlcnZpY2VNb2RlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVdvcmtiZW5jaEFkYXB0ZXIgZXh0ZW5kcyBXb3JrYmVuY2hBZGFwdGVyIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFNlcnZpY2VNb2RlbEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoU2VydmljZU1vZGVsSW1hZ2VzLklNR19TRVJWSUNFX0RJU0FCTEVEKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKElTZXJ2aWNlKW9iamVjdCkuZ2V0TmFtZSgpICsgIiBTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL0lTZXJ2aWNlQ29udHJpYnV0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvSVNlcnZpY2VDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ1MWE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvSVNlcnZpY2VDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBzdXBwbGllcyB3aXphcmQgcGFnZXMgdG8gY29uZmlndXJlIGEgc2VydmljZS4KLSAqCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgb3IKLSAqIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZwotICogd2l0aCB0aGUgUkRUIHRlYW0uCi0gKiAKLSAqIEBzZWUgSVNlcnZpY2VQcm92aWRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlQ29udHJpYnV0b3IgewotCS8qKgotCSAqIFJldHJpZXZlIHRoZSB3aXphcmQgcGFnZXMgdG8gYmUgZGlzcGxheWVkIHByaW9yIHRvIGNvbmZpZ3VyaW5nIGEgcHJvdmlkZXIKLQkgKiBmb3IgdGhlIHNlcnZpY2UuCi0JICogCi0JICogQHBhcmFtIHNlcnZpY2UKLQkgKiBAcmV0dXJuIHdpemFyZCBwYWdlcyBmb3IgdGhlIHNlcnZpY2VzLgotCSAqLwotCXB1YmxpYyBXaXphcmRQYWdlW10gZ2V0V2l6YXJkUGFnZXMoSVNlcnZpY2Ugc2VydmljZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL0lTZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL0lTZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTdjMDYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9JU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBzdXBwbGllcyBhIFVJIHdoaWNoIGNhbiBiZSBsYXVuY2hlZCB0byBjb25maWd1cmUgYSBzZXJ2aWNlIHByb3ZpZGVyLgotICoKLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBvcgotICogdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nCi0gKiB3aXRoIHRoZSBSRFQgdGVhbS4KLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIEBzZWUgSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZpY2VQcm92aWRlckNvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIENvbmZpZ3VyZSB0aGUgc2VydmljZSBwcm92aWRlciwgd2hpY2ggdHlwaWNhbGx5IGxhdW5jaGVzIGEgZGlhbG9nL3dpemFyZCB0byBhbGxvdyB0aGUgCi0JICogc2VydmljZSBwcm92aWRlciB0byBiZSBjb25maWd1cmVkIChtYXkgaW5jbHVkZSBzZXR0aW5nIHVwIGFuZCBhc3NvY2lhdGluZyBhbnkgcmVxdWlyZWQgY29ubmVjdGlvbnMpCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIHBhcmVudCBTV1Qgc2hlbGwgb2YgdGhlIFVJIHRoYXQgaXMgdG8gYmUgbGF1bmNoZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciwgU2hlbGwgcGFyZW50U2hlbGwpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDc5ZGEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBzdXBwbGllcyBhIFVJIHdoaWNoIGNhbiBiZSBsYXVuY2hlZCB0byBjb25maWd1cmUgYSBzZXJ2aWNlIHByb3ZpZGVyLgotICoKLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBvcgotICogdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nCi0gKiB3aXRoIHRoZSBSRFQgdGVhbS4KLSAqIAotICogQHNlZSBJU2VydmljZVByb3ZpZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yIHsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNlY3Rpb24gb24gdGhlIHNlcnZpY2UgbW9kZWwgcHJvcGVydGllcyBwYWdlIHRvIGNvbmZpZ3VyZSB0aGUgc2VydmljZSBwcm92aWRlci4KLQkgKiBUaGUgY29tcG9zaXRlIGRvZXMgbm90IGhhdmUgYSBsYXlvdXQgbWFuYWdlciBhdHRhY2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlU2VydmljZVByb3ZpZGVyKElTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIsIENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSB3aXphcmQgcGFnZXMgZm9yIGEgc2VydmljZSBwcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZCB0aGF0IHdpbGwgZGlzcGxheSB0aGUgcGFnZXMKLQkgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyIGJlaW5nIGNvbmZpZ3VyZWQKLQkgKiBAcmV0dXJuIHdpemFyZCBwYWdlcyBmb3IgdGhlIHByb3ZpZGVyCi0JICovCi0JcHVibGljIFdpemFyZFBhZ2VbXSBnZXRXaXphcmRQYWdlcyhJV2l6YXJkIHdpemFyZCwgSVNlcnZpY2VQcm92aWRlciBwcm92aWRlcik7Ci0JCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIHdpemFyZCBmb3IgYSBzZXJ2aWNlIHByb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyIHRoZSBwcm92aWRlciBiZWluZyBjb25maWd1cmVkCi0JICogQHBhcmFtIHBhZ2UgbmV4dCBTZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBieSBhIFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkLCBvciBudWxsIG90aGVyd2lzZQotCSAqIEByZXR1cm4gdGhlIHdpemFyZCB0byBjb25maWd1cmUgdGhpcyBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBJV2l6YXJkIGdldFdpemFyZChJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyLCBJV2l6YXJkUGFnZSBwYWdlKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvU2VydmljZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvU2VydmljZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwYzI4Yi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL1NlcnZpY2VDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuUHJvamVjdE5vdENvbmZpZ3VyZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuZGlhbG9ncy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpZGdldHMuTmV3U2VydmljZU1vZGVsV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBwcm9qZWN0IHByb3BlcnRpZXMgcGFnZSB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8KLSAqIGFzc29jaWF0ZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zIHdpdGggdGhlIHByb2plY3QKLSAqIAotICogQGF1dGhvciBkYXZlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7Ci0JLyoqCi0JICogQ2xhc3MgdG8gaGFuZGxlIHdpZGdldCBzZWxlY3Rpb24gZXZlbnRzCi0JICogCi0JICogQGF1dGhvciBkYXZlCi0JICogCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBFdmVudEhhbmRsZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcKLQkJICogLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlCi0JCSAqIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2UKLQkJICogLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlOwotCi0JCQlzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSBzZXJ2aWNlQ29uZmlndXJhdGlvbkxpc3QpIHsKLQkJCQlzaG93U2VsZWN0ZWRDb25maWd1cmF0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSBhZGRCdXR0b24pIHsKLQkJCQlhZGRTZXJ2aWNlQ29uZmlndXJhdGlvbigpOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gcmVtb3ZlQnV0dG9uKSB7Ci0JCQkJcmVtb3ZlU2VydmljZUNvbmZpZ3VyYXRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmF0b3IgY2xhc3MgdXNlZCB0byBzb3J0IHNlcnZpY2UgY29uZmlndXJhdGlvbnMgaW4gYXNjZW5kaW5nIG9yZGVyCi0JICogYnkgbmFtZQotCSAqIAotCSAqIEBhdXRob3IgZGF2ZQotCSAqIAotCSAqLwotCXByaXZhdGUgY2xhc3MgU2VydmljZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCXJldHVybiAoKElTZXJ2aWNlQ29uZmlndXJhdGlvbikgbzEpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJCSgoSVNlcnZpY2VDb25maWd1cmF0aW9uKSBvMikuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcml2YXRlIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnOwotCXByaXZhdGUgVmVjdG9yPElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gZGVsZXRlZFNlcnZpY2VDb25maWd1cmF0aW9uczsKLQlwcml2YXRlIEV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcHJvcGVydGllc1BhbmU7Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgU2VydmljZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yIHNlcnZpY2VDb25maWd1cmF0aW9uQ29tcGFyYXRvcjsKLQlwcml2YXRlIFRhYmxlIHNlcnZpY2VDb25maWd1cmF0aW9uTGlzdDsKLQlwcml2YXRlIENvbXBvc2l0ZSBzZXJ2aWNlTW9kZWxQYW5lOwotCXByaXZhdGUgTmV3U2VydmljZU1vZGVsV2lkZ2V0IHNlcnZpY2VNb2RlbFdpZGdldDsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgcGFnZQotCSAqLwotCXB1YmxpYyBTZXJ2aWNlQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yID0gbmV3IFNlcnZpY2VDb25maWd1cmF0aW9uQ29tcGFyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG5ldyBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGxpc3Qgb2Ygc2VydmljZSBjb25maWd1cmF0aW9ucwotCSAqIHVzZWQgYnkgdGhpcyBwcm9qZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZpY2VDb25maWd1cmF0aW9uKCkgewotCQlTZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbkRpYWxvZyBkaWFsb2c7Ci0JCWludCBzdGF0dXM7Ci0JCVNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGNvbmZpZ3M7Ci0KLQkJLy8gRGlzcGxheSBhIGRpYWxvZyBjb250YWluaW5nIGEgbGlzdCBvZiBhdmFpbGFibGUgc2VydmljZQotCQkvLyBjb25maWd1cmF0aW9ucwotCQl0cnkgewotCQkJY29uZmlncyA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucygKLQkJCQkJZ2V0UHJvamVjdCgpKTsKLQkJfSBjYXRjaCAoUHJvamVjdE5vdENvbmZpZ3VyZWRFeGNlcHRpb24gZSkgewotCQkJY29uZmlncyA9IG5ldyBIYXNoU2V0PElTZXJ2aWNlQ29uZmlndXJhdGlvbj4oKTsKLQkJfQotCQlkaWFsb2cgPSBuZXcgU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgY29uZmlncyk7Ci0JCXN0YXR1cyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzdGF0dXMgPT0gV2luZG93Lk9LKSB7Ci0JCQlJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJVGFibGVJdGVtIGl0ZW07Ci0KLQkJCWNvbmZpZyA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHNlcnZpY2VDb25maWd1cmF0aW9uTGlzdCwgMCk7Ci0JCQkJaXRlbS5zZXREYXRhKGNvbmZpZyk7Ci0JCQkJaXRlbS5zZXRUZXh0KGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCVNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRDb25maWd1cmF0aW9uKAotCQkJCQkJZ2V0UHJvamVjdCgpLCBjb25maWcpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IHBhcmVudFBhbmVMYXlvdXQ7Ci0JCUdyaWRMYXlvdXQgcHJvcGVydGllc1BhbmVMYXlvdXQ7Ci0JCUdyaWRMYXlvdXQgc2VydmljZUNvbmZpZ0xheW91dDsKLQkJUm93TGF5b3V0IGJ1dHRvbkxheW91dDsKLQkJQ29tcG9zaXRlIHNlcnZpY2VDb25maWd1cmF0aW9uUGFuZTsKLQkJQ29tcG9zaXRlIGJ1dHRvblBhbmU7Ci0KLQkJZXZlbnRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpOwotCi0JCS8vIENyZWF0ZSBhIHRvcCBsZXZlbCBjb21wb3NpdGUgZm9yIHRoZSB3aWRnZXRzIGluIHRoaXMgcGFuZWwKLQkJcGFyZW50UGFuZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KHBhcmVudFBhbmVMYXlvdXQpOwotCi0JCS8vIENyZWF0ZSB0aGUgcHJvcGVydGllcyBwYW5lLCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIHNlcnZpY2UKLQkJLy8gY29uZmlndXJhdGlvbiBsaXN0Ci0JCS8vIGFuZCB0aGUgY3VycmVudCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkJcHJvcGVydGllc1BhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9wZXJ0aWVzUGFuZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCQlwcm9wZXJ0aWVzUGFuZUxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJcHJvcGVydGllc1BhbmUuc2V0TGF5b3V0KHByb3BlcnRpZXNQYW5lTGF5b3V0KTsKLQkJcHJvcGVydGllc1BhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBwYW5lIGZvciB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIGxpc3QgYW5kIHRoZW4gY3JlYXRlCi0JCS8vIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gbGlzdAotCQlzZXJ2aWNlQ29uZmlndXJhdGlvblBhbmUgPSBuZXcgQ29tcG9zaXRlKHByb3BlcnRpZXNQYW5lLCBTV1QuTk9ORSk7Ci0JCXNlcnZpY2VDb25maWdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25QYW5lLnNldExheW91dChzZXJ2aWNlQ29uZmlnTGF5b3V0KTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25QYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlcnZpY2VDb25maWd1cmF0aW9uTGlzdCA9IG5ldyBUYWJsZShzZXJ2aWNlQ29uZmlndXJhdGlvblBhbmUsIFNXVC5TSU5HTEUpOwotCQlzZXJ2aWNlQ29uZmlndXJhdGlvbkxpc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uTGlzdC5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudEhhbmRsZXIpOwotCi0JCS8vIENyZWF0ZSB0aGUgcGFuZSB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGN1cnJlbnQgc2VydmljZSBtb2RlbAotCQlzZXJ2aWNlTW9kZWxQYW5lID0gbmV3IENvbXBvc2l0ZShwcm9wZXJ0aWVzUGFuZSwgU1dULk5PTkUpOwotCQlzZXJ2aWNlTW9kZWxQYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlzZXJ2aWNlTW9kZWxQYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJc2VydmljZU1vZGVsV2lkZ2V0ID0gbmV3IE5ld1NlcnZpY2VNb2RlbFdpZGdldChzZXJ2aWNlTW9kZWxQYW5lLCBTV1QuTk9ORSk7Ci0JCXNlcnZpY2VNb2RlbFdpZGdldC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0KLQkJLy8gQ3JlYXRlIHRoZSBwYW5lIGFuZCBidXR0b25zIHRvIGFkZCBhbmQgcmVtb3ZlIHNlcnZpY2UgY29uZmlndXJhdGlvbnMKLQkJYnV0dG9uUGFuZSA9IG5ldyBDb21wb3NpdGUoc2VydmljZUNvbmZpZ3VyYXRpb25QYW5lLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkxheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJYnV0dG9uTGF5b3V0LmZpbGwgPSB0cnVlOwotCQlidXR0b25MYXlvdXQuY2VudGVyID0gZmFsc2U7Ci0JCWJ1dHRvbkxheW91dC5qdXN0aWZ5ID0gdHJ1ZTsKLQkJYnV0dG9uUGFuZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlNlcnZpY2VDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlXzApOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRIYW5kbGVyKTsKLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlNlcnZpY2VDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlXzEpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRIYW5kbGVyKTsKLQotCQkvLyBGaWxsIGluIHRoZSBsaXN0IG9mIHNlcnZpY2UgY29uZmlndXJhdGlvbnMgY3VycmVudGx5IHVzZWQgYnkgdGhpcwotCQkvLyBwcm9qZWN0Ci0JCWdldFByb2plY3RDb25maWd1cmF0aW9ucygpOwotCQlyZXR1cm4gcHJvcGVydGllc1BhbmU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHNlbGVjdGVkIHNlcnZpY2UgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgc2V0IG9mIHNlcnZpY2UKLQkgKiBjb25maWd1cmF0aW9ucyBrbm93biB0byB0aGUgc2VydmljZSBtb2RlbCBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVNlcnZpY2VDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKGRlbGV0ZWRTZXJ2aWNlQ29uZmlndXJhdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnIDogZGVsZXRlZFNlcnZpY2VDb25maWd1cmF0aW9ucykgewotCQkJCVNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVDb25maWd1cmF0aW9uKAotCQkJCQkJZ2V0UHJvamVjdCgpLCBjb25maWcpOwotCQkJfQotCQkJZGVsZXRlZFNlcnZpY2VDb25maWd1cmF0aW9ucy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IE9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gVGhlIHByb2plY3QKLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSBjb25maWd1cmF0aW9uIHVzZWQgYnkgdGhpcyBwcm9qZWN0LCBzb3J0IGJ5IG5hbWUKLQkgKiBhbmQgdGhlbiBwb3B1bGF0ZSB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIGxpc3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdldFByb2plY3RDb25maWd1cmF0aW9ucygpIHsKLQkJT2JqZWN0IHNlcnZpY2VDb25maWd1cmF0aW9uc1tdOwotCi0JCXRyeSB7Ci0JCQlzZXJ2aWNlQ29uZmlndXJhdGlvbnMgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25zKGdldFByb2plY3QoKSkudG9BcnJheSgpOwotCQkJQXJyYXlzLnNvcnQoc2VydmljZUNvbmZpZ3VyYXRpb25zLCBzZXJ2aWNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IpOwotCQkJZm9yIChPYmplY3QgY29uZmlnIDogc2VydmljZUNvbmZpZ3VyYXRpb25zKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW07Ci0KLQkJCQlpdGVtID0gbmV3IFRhYmxlSXRlbShzZXJ2aWNlQ29uZmlndXJhdGlvbkxpc3QsIDApOwotCQkJCWl0ZW0uc2V0RGF0YShjb25maWcpOwotCQkJCWl0ZW0uc2V0VGV4dCgwLCAoKElTZXJ2aWNlQ29uZmlndXJhdGlvbikgY29uZmlnKS5nZXROYW1lKCkpOwotCQkJfQotCQl9IGNhdGNoIChQcm9qZWN0Tm90Q29uZmlndXJlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgc2VydmljZSBjb25maWd1cmF0aW9ucyB3aGVuIE9rIG9yIEFwcGx5IGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogCi0JICogQHJldHVybiBTdGF0dXMgZnJvbSBzdXBlcmNsYXNzIGluZGljYXRpbmcgaWYgT2sgcHJvY2Vzc2luZyBpcyB0byBjb250aW51ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZGVsZXRlU2VydmljZUNvbmZpZ3VyYXRpb25zKCk7Ci0JCXNlcnZpY2VNb2RlbFdpZGdldC5hcHBseUNoYW5nZXNUb0NvbmZpZ3VyYXRpb24oKTsKLQkJdHJ5IHsKLQkJCVNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zYXZlTW9kZWxDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZpY2VzVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzZWxlY3RlZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgcHJvamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTZXJ2aWNlQ29uZmlndXJhdGlvbigpIHsKLQkJVGFibGVJdGVtIHNlbGVjdGlvbltdOwotCQlJU2VydmljZUNvbmZpZ3VyYXRpb24gc2VsZWN0ZWRDb25maWc7Ci0KLQkJc2VsZWN0aW9uID0gc2VydmljZUNvbmZpZ3VyYXRpb25MaXN0LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKLQkJCXNlbGVjdGVkQ29uZmlnID0gKElTZXJ2aWNlQ29uZmlndXJhdGlvbikgc2VsZWN0aW9uWzBdLmdldERhdGEoKTsKLQkJCWlmIChkZWxldGVkU2VydmljZUNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCQlkZWxldGVkU2VydmljZUNvbmZpZ3VyYXRpb25zID0gbmV3IFZlY3RvcjxJU2VydmljZUNvbmZpZ3VyYXRpb24+KCk7Ci0JCQl9Ci0JCQkvLyBTZWxlY3RlZCBzZXJ2aWNlIG1vZGVsIGlzIGFkZGVkIHRvIHZlY3RvciB0byBiZSBkZWxldGVkIGR1cmluZyBPawotCQkJLy8gb3IgQXBwbHkgYnV0dG9uIHByb2Nlc3NpbmcKLQkJCWRlbGV0ZWRTZXJ2aWNlQ29uZmlndXJhdGlvbnMuYWRkKHNlbGVjdGVkQ29uZmlnKTsKLQkJCXNlcnZpY2VDb25maWd1cmF0aW9uTGlzdC5yZW1vdmUoc2VydmljZUNvbmZpZ3VyYXRpb25MaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJc2VydmljZU1vZGVsV2lkZ2V0LnNldFNlcnZpY2VDb25maWd1cmF0aW9uKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2hvdyB0aGUgZGV0YWlscyBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93U2VsZWN0ZWRDb25maWd1cmF0aW9uKCkgewotCQlUYWJsZUl0ZW0gc2VsZWN0aW9uW107Ci0JCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZzsKLQotCQlzZWxlY3Rpb24gPSBzZXJ2aWNlQ29uZmlndXJhdGlvbkxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCkgewotCQkJc2VsZWN0ZWRDb25maWcgPSAoSVNlcnZpY2VDb25maWd1cmF0aW9uKSBzZWxlY3Rpb25bMF0uZ2V0RGF0YSgpOwotCQkJaWYgKHNlbGVjdGVkQ29uZmlnICE9IGN1cnJlbnRDb25maWcpIHsKLQkJCQljdXJyZW50Q29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JCQkJCi0JCQkJU2V0PFN0cmluZz4gbmF0dXJlcyA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJCWlmKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbmF0dXJlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCkpKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTZXJ2aWNlc1VJUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2VydmljZU1vZGVsV2lkZ2V0LnNldFNlcnZpY2VDb25maWd1cmF0aW9uKHNlbGVjdGVkQ29uZmlnLCBuYXR1cmVzKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvU2VydmljZU1vZGVsSW1hZ2VzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL1NlcnZpY2VNb2RlbEltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjNiNzNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvU2VydmljZU1vZGVsSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTW9kZWxJbWFnZXMgewotCi0JLy8gPT09PSBVUkxzIGZvciBJY29uIEZvbGRlcnMgPT09PSAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFVSTCBJQ09OX1VSTCA9IFNlcnZpY2VzVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJpY29ucy9ldG9vbDE2LyIpOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gPT09PT0gSWNvbiBGaWxlcyA9PT09PQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWSUNFID0gInNlcnZpY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWSUNFX0NBVEVHT1JZID0gInNlcnZpY2UtY2F0ZWdvcnkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWSUNFX0RJU0FCTEVEID0gInNlcnZpY2UtZGlzYWJsZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQljcmVhdGVJbWFnZURlc2NyaXB0b3IoSUNPTl9VUkwsIElNR19TRVJWSUNFLCBJTUdfU0VSVklDRSk7Ci0JCWNyZWF0ZUltYWdlRGVzY3JpcHRvcihJQ09OX1VSTCwgSU1HX1NFUlZJQ0VfQ0FURUdPUlksIElNR19TRVJWSUNFX0NBVEVHT1JZKTsKLQkJY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKElDT05fVVJMLCBJTUdfU0VSVklDRV9ESVNBQkxFRCwgSU1HX1NFUlZJQ0VfRElTQUJMRUQpOwotCX0KLQkKLQkvKiogCi0JICogQ3JlYXRlIGFuIGltYWdlIGRlc2NyaXB0b3IgYW5kIGFkZCBpdCB0byB0aGUgcmVnaXN0cnkKLQkgKiAKLQkgKiBAcGFyYW0gaWNvblVSTCB1cmwgZm9yIGltYWdlCi0JICogQHBhcmFtIGtleSBpbWFnZSBuYW1lCi0JICogQHBhcmFtIG5hbWUgZmlsZSBuYW1lIG9mIGltYWdlCi0JICogQHJldHVybiBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihVUkwgaWNvblVSTCwgU3RyaW5nIGtleSwgU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChnZXRJY29uVVJMKGljb25VUkwsIG5hbWUpKTsKLQkJCWFkZEltYWdlRGVzY3JpcHRvcihrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBpbWFnZSBmcm9tIHRoZSByZWdpc3RyeQotCSAqIAotCSAqIEBwYXJhbSBrZXkgaW1hZ2UgbmFtZQotCSAqIEByZXR1cm4gaW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIHJlZ2lzdHJ5Ci0JICogCi0JICogQHBhcmFtIGtleSBpbWFnZSBuYW1lCi0JICogQHJldHVybiBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JfQotCQotCS8qKiAKLQkgKiBBZGQgaW1hZ2UgZGVzY3JpcHRvciB0byByZWdpc3RyeQotCSAqIAotCSAqIEBwYXJhbSBrZXkgaW1hZ2UgbmFtZQotCSAqIEBwYXJhbSBpbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yKSB7Ci0JCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCX0KLQkJCi0JLyoqIAotCSAqIENyZWF0ZSBVUkwgZm9yIGljb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVVSTCBiYXNlIFVSTCBmb3IgaWNvbgotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgaWNvbiBmaWxlCi0JICogQHJldHVybiBVUkwgcG9pbnRpbmcgdG8gaWNvbiBmaWxlCi0JICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0SWNvblVSTChVUkwgYmFzZVVSTCwgU3RyaW5nIG5hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlpZiAoYmFzZVVSTCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBVUkwoYmFzZVVSTCwgbmFtZSk7Ci0JfQotCQotCS8qKiAKLQkgKiBHZXQgdGhlIGltYWdlIHJlZ2lzdHJ5Ci0JICogCi0JICogQHJldHVybiBpbWFnZSByZWdpc3RyeQotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9TZXJ2aWNlTW9kZWxVSU1hbmFnZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvU2VydmljZU1vZGVsVUlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NGY4NTcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9TZXJ2aWNlTW9kZWxVSU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yOwotCi0vKioKLSAqIEEgc2luZ2xldG9uIGNsYXNzIHdoaWNoIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhIHNlcnZpY2UgbW9kZWwgd2hpY2ggcmVwcmVzZW50czoKLSAqIC0gdGhlIHNldCBvZiBjb250cmlidXRlZCBzZXJ2aWNlcwotICogLSB0aGUgc2V0IG9mIHByb3ZpZGVycyB3aGljaCBwcm92aWRlIHRob3NlIHNlcnZpY2VzCi0gKiAtIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zIGZvciBlYWNoIHByb2plY3Qgd2hpY2ggc3BlY2lmeSB3aGljaCBzZXJ2aWNlcyBhcmUKLSAqIAkJbWFwcGVkIHRvIHdoaWNoIHByb3ZpZGVycy4KLSAqCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgb3IKLSAqIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZwotICogd2l0aCB0aGUgUkRUIHRlYW0uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VNb2RlbFVJTWFuYWdlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfRVhURU5TSU9OX0lEID0gInNlcnZpY2VDb250cmlidXRvcnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1ZJREVSX0VYVEVOU0lPTl9JRCA9ICJwcm92aWRlckNvbnRyaWJ1dG9ycyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9JRCA9ICJ3aXphcmRFeHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1VJX0NMQVNTID0gImNvbmZpZ3VyYXRpb25VSUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZU1vZGVsVUlNYW5hZ2VyIGZJbnN0YW5jZTsKLQkKLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTZXJ2aWNlTW9kZWxVSU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmKGZJbnN0YW5jZSA9PSBudWxsKQotCQkJZkluc3RhbmNlID0gbmV3IFNlcnZpY2VNb2RlbFVJTWFuYWdlcigpOwotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gVUkgYXNzb2NpYXRlZCB3aXRoIGEgc2VydmljZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmljZSBzZXJ2aWNlCi0JICogQHJldHVybiBjbGFzcyBpbXBsZW1lbnRpbmcgSVNlcnZpY2VDb250cmlidXRvcgotCSAqLwotCXB1YmxpYyBJU2VydmljZUNvbnRyaWJ1dG9yIGdldFNlcnZpY2VDb250cmlidXRvcihJU2VydmljZSBzZXJ2aWNlKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoU2VydmljZXNVSVBsdWdpbi5QTFVHSU5fSUQsCVNFUlZJQ0VfRVhURU5TSU9OX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJCWlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0lEKS5lcXVhbHMoc2VydmljZS5nZXRJZCgpKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZXR1cm4gKElTZXJ2aWNlQ29udHJpYnV0b3IpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU2VydmljZXNVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gVUkgYXNzb2NpYXRlZCB3aXRoIGEgc2VydmljZSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzYyBzZXJ2aWNlIHByb3ZpZGVyIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGNsYXNzIGltcGxlbWVudGluZyBJU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IKLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yIGdldFNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2MpIHsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChTZXJ2aWNlc1VJUGx1Z2luLlBMVUdJTl9JRCwJUFJPVklERVJfRVhURU5TSU9OX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJCWlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0lEKS5lcXVhbHMoZGVzYy5nZXRJZCgpKSkgewotCQkJCQkJaWYoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUykgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXJldHVybiAoSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUl9DTEFTUyk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJU2VydmljZXNVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhbnkgd2l6YXJkIGV4dGVuc2lvbnMuCi0JICogCi0JICogQHJldHVybiBJV2l6YXJkIHByb3ZpZGluZyBhIHdpemFyZCBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgSVdpemFyZCBnZXRXaXphcmRFeHRlbnNpb25zKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFNlcnZpY2VzVUlQbHVnaW4uUExVR0lOX0lELAlXSVpBUkRfRVhURU5TSU9OX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gKElXaXphcmQpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVNlcnZpY2VzVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhlKTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZGVzYwotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBJU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbiBnZXRTZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uVUkoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzYykgewotCQlJU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFNlcnZpY2VzVUlQbHVnaW4uUExVR0lOX0lELAlQUk9WSURFUl9FWFRFTlNJT05fSUQpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJZm9yIChJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKSkgewotCQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfSUQpLmVxdWFscyhkZXNjLmdldElkKCkpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNvbmZpZyA9IChJU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfVUlfQ0xBU1MpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9TZXJ2aWNlc1VJUGx1Z2luLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL1NlcnZpY2VzVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4MTA0MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL1NlcnZpY2VzVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiBUaGlzIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcwotICogcGFydCBvZiBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgQVBJIHdpbGwgd29yayBvcgotICogdGhhdCBpdCB3aWxsIHJlbWFpbiB0aGUgc2FtZS4gUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBBUEkgd2l0aG91dCBjb25zdWx0aW5nCi0gKiB3aXRoIHRoZSBSRFQgdGVhbS4KLSAqIAotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlc1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZXNVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgU2VydmljZXNVSVBsdWdpbigpIHsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZpY2VzVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiRXJyb3IiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvZGlhbG9ncy9TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9kaWFsb2dzL1NlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTk0NjMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9kaWFsb2dzL1NlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkud2lkZ2V0cy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIERpc3BsYXkgYSBkaWFsb2cgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHNlcnZpY2UgY29uZmlndXJhdGlvbiB0byBhZGQKLSAqIHRvIHRoZSBwcm9qZWN0LiBPbmx5IHNlcnZpY2UgY29uZmlndXJhdGlvbnMgbm90IGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBwcm9qZWN0Ci0gKiBhcmUgZGlzcGxheWVkLgotICogCi0gKiBAYXV0aG9yIGRhdmUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCXByaXZhdGUgVGFibGUgc2VydmljZUNvbmZpZ3VyYXRpb25MaXN0OwotCXByaXZhdGUgSVNlcnZpY2VDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlnOwotCi0JcHJpdmF0ZSBTZXQ8SVNlcnZpY2VDb25maWd1cmF0aW9uPiBjdXJyZW50U2VydmljZUNvbmZpZ3VyYXRpb25zOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZGlhbG9nIGxpc3RpbmcgdGhlIHNlcnZpY2UgY29uZmlndXJhdGlvbnMgd2hpY2ggY2FuIGJlIHNlbGVjdGVkCi0JICogZm9yIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBTaGVsbCB0byB1c2Ugd2hlbiBkaXNwbGF5aW5nIHRoZSBkaWFsb2cKLQkgKiBAcGFyYW0gY3VycmVudENvbmZpZ3MKLQkgKiAgICAgICAgICAgIFNldCBvZiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLAotCQkJU2V0PElTZXJ2aWNlQ29uZmlndXJhdGlvbj4gY3VycmVudENvbmZpZ3MpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQljdXJyZW50U2VydmljZUNvbmZpZ3VyYXRpb25zID0gY3VycmVudENvbmZpZ3M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSB3aWRnZXRzIHVzZWQgdG8gZGlzcGxheSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgc2VydmljZQotCSAqIGNvbmZpZ3VyYXRpb25zCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgLSBUaGUgY29tcG9zaXRlIHdpZGdldCB0aGF0IGlzIHBhcmVudCB0byB0aGUgY2xpZW50IGFyZWEKLQkgKiBAcmV0dXJuIFRvcCBsZXZlbCBjb250cm9sIGZvciBjbGllbnQgYXJlYQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc2VydmljZUNvbmZpZ3VyYXRpb25QYW5lOwotCQlHcmlkTGF5b3V0IGxheW91dDsKLQotCQlzZXRUaXRsZShNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbkRpYWxvZ18wKTsKLQkJc2V0TWVzc2FnZShNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbkRpYWxvZ18xLCBTV1QuTk9ORSk7Ci0JCQotCQlzZXJ2aWNlQ29uZmlndXJhdGlvblBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25QYW5lLnNldExheW91dChsYXlvdXQpOwotCQlzZXJ2aWNlQ29uZmlndXJhdGlvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQotCQlDb21wb3NpdGUgd2lkZ2V0ID0gbmV3IFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0KHNlcnZpY2VDb25maWd1cmF0aW9uUGFuZSwgU1dULk5PTkUsIGN1cnJlbnRTZXJ2aWNlQ29uZmlndXJhdGlvbnMsIGZhbHNlKTsKLQkJd2lkZ2V0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlyZXR1cm4gd2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyCi0JICogCi0JICogQHJldHVybiBTZWxlY3RlZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvZGlhbG9ncy9TZXJ2aWNlc0RpYWxvZy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9kaWFsb2dzL1NlcnZpY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhODdjYjEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9kaWFsb2dzL1NlcnZpY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBAYXV0aG9yIGdyZWcKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlc0RpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9LRVkgPSAic2VydmljZS1pZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVNlcnZpY2VbXSBmU2VsZWN0ZWRTZXJ2aWNlcyA9IG5ldyBJU2VydmljZVswXTsKLQlwcml2YXRlIFRhYmxlIGZUYWJsZTsKLQlwcml2YXRlIElTZXJ2aWNlW10gZlNlcnZpY2VzOwotCQotCXB1YmxpYyBTZXJ2aWNlc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZpY2VbXSBzZXJ2aWNlcykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZlNlcnZpY2VzID0gc2VydmljZXM7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlNIRUVUKTsKLQl9Ci0JCi0JcHVibGljIElTZXJ2aWNlW10gZ2V0U2VsZWN0ZWRTZXJ2aWNlcygpIHsKLQkJcmV0dXJuIGZTZWxlY3RlZFNlcnZpY2VzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlzZXRUaXRsZShNZXNzYWdlcy5TZXJ2aWNlc0RpYWxvZ18wKTsKLQkJc2V0TWVzc2FnZShNZXNzYWdlcy5TZXJ2aWNlc0RpYWxvZ18xKTsKLQotCQlmVGFibGUgPSBuZXcgVGFibGUoY29udGFpbmVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJZlRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JCWZUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJZlRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlmVGFibGUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGZUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlmU2VsZWN0ZWRTZXJ2aWNlcyA9IG5ldyBJU2VydmljZVtpdGVtcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJZlNlbGVjdGVkU2VydmljZXNbaW5kZXhdID0gKElTZXJ2aWNlKSBpdGVtc1tpbmRleF0uZ2V0RGF0YShTRVJWSUNFX0tFWSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljcmVhdGVUYWJsZUNvbnRlbnQoKTsKLQkJCi0JCWZUYWJsZS5zZXRWaXNpYmxlKHRydWUpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVDb250ZW50KCkgewotCQlmVGFibGUucmVtb3ZlQWxsKCk7Ci0JCQotCQlmb3IgKElTZXJ2aWNlIHNlcnZpY2UgOiBmU2VydmljZXMpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAoZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKDAsIHNlcnZpY2UuZ2V0TmFtZSgpKTsKLQkJCWl0ZW0uc2V0RGF0YShTRVJWSUNFX0tFWSwgc2VydmljZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjRiZWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkubWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLm1lc3NhZ2VzLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmljZU1vZGVsV2lkZ2V0XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmljZU1vZGVsV2lkZ2V0XzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmljZU1vZGVsV2lkZ2V0XzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmljZU1vZGVsV2lkZ2V0XzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZVNlcnZpY2VDb25maWd1cmF0aW9uQWN0aW9uXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RBY3RpdmVTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbl8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25QcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25QcmVmZXJlbmNlUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25QcmVmZXJlbmNlUGFnZV82OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZV8xOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uRGlhbG9nXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25EaWFsb2dfMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldF85OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzEzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkXzY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VNb2RlbFdpZGdldF83OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZU1vZGVsV2lkZ2V0Xzg7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmljZU1vZGVsV2lkZ2V0RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZXNEaWFsb2dfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlc0RpYWxvZ18xOwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNDdkMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1OZXdTZXJ2aWNlTW9kZWxXaWRnZXRfMD1BdmFpbGFibGUgU2VydmljZXMKLU5ld1NlcnZpY2VNb2RlbFdpZGdldF8xPUVuYWJsZSBTZXJ2aWNlCi1OZXdTZXJ2aWNlTW9kZWxXaWRnZXRfMj1TZXJ2aWNlIFByb3ZpZGVyOgotTmV3U2VydmljZU1vZGVsV2lkZ2V0XzM9QWRkaXRpb25hbCBTZXJ2aWNlcwotUmVtb3ZlU2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb25fMD1SZW1vdmUgU2VydmljZSBDb25maWd1cmF0aW9ucwotUmVtb3ZlU2VydmljZUNvbmZpZ3VyYXRpb25BY3Rpb25fMT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgc2VydmljZSBjb25maWd1cmF0aW9uKHMpP1xuCi1TZWxlY3RBY3RpdmVTZXJ2aWNlQ29uZmlndXJhdGlvbkFjdGlvbl8wPVNldCBBY3RpdmUgU2VydmljZSBDb25maWd1cmF0aW9uCi1TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzA9U2VydmljZSBDb25maWd1cmF0aW9uCi1TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzE9TmFtZQotU2VydmljZUNvbmZpZ3VyYXRpb25QcmVmZXJlbmNlUGFnZV8yPVByb2plY3QKLVNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2VfMz1BZGQKLVNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2VfND1FZGl0Ci1TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzU9RGVsZXRlCi1TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzY9bmV3IGNvbmZpZwotU2VydmljZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2VfMD1BZGQKLVNlcnZpY2VDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlXzE9UmVtb3ZlCi1TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbkRpYWxvZ18wPUF2YWlsYWJsZSBTZXJ2aWNlIENvbmZpZ3VyYXRpb25zCi1TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbkRpYWxvZ18xPVNlbGVjdCBTZXJ2aWNlIENvbmZpZ3VyYXRpb24KLVNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzA9U2VydmljZSBDb25maWd1cmF0aW9uczoKLVNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzE9QWRkLi4uCi1TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldF8yPUFkZCBTZXJ2aWNlIENvbmZpZ3VyYXRpb24KLVNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzM9RW50ZXIgYSBuYW1lIGZvciB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uOgotU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfND1SZW1vdmUKLVNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0Xzk9UmVtb3ZlIFNlcnZpY2UgQ29uZmlndXJhdGlvbgotU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMTA9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uKHMpIHswfT8KLVNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0XzExPVJlbmFtZQotU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMTI9UmVuYW1lIFNlcnZpY2UgQ29uZmlndXJhdGlvbgotU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMTM9RW50ZXIgYSBuZXcgbmFtZSBmb3IgdGhlIG5ldyBzZXJ2aWNlIGNvbmZpZ3VyYXRpb246Ci1TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF8xPVNlcnZpY2UgQ29uZmlndXJhdGlvbiBXaXphcmQKLVNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkXzA9VGhpcyBwYWdlIGFsbG93cyB5b3UgdG8gbWFrZSBhbnkgZmluYWwgYWRkaXRpb25zIG9yIGNvbmZpZ3VyZSBhbnkgcmVtYWluaW5nIHNlcnZpY2VzCi1TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF8yPVRoaXMgd2l6YXJkIHdpbGwgaGVscCB5b3UgY29uZmlndXJlIEVjbGlwc2UgZm9yIEhQQyBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudAotU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfMz1Zb3Ugd2lsbCBiZSBnaXZlbiBhbiBvcHBvcnR1bml0eSB0byBjb25maWd1cmUgZWFjaCBhc3BlY3Qgb2YgdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50LgotU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfND1JZiB5b3UgbWFrZSBhIG1pc3Rha2Ugb3IgY29uZmlndXJlIHNvbWV0aGluZyBpbmNvcnJlY3RseSwgc2ltcGx5IGNsaWNrIG9uIHRoZSAiQmFjayIgYnV0dG9uLgotU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfNT1EbyBub3Qgc2hvdyB0aGlzIHBhZ2UgYWdhaW4uCi1TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF82PUhQQyBQcm9qZWN0IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfMD1TZWxlY3QgYSBQcm92aWRlcjoKLVNlcnZpY2VNb2RlbFdpZGdldF8wPVNlcnZpY2UKLVNlcnZpY2VNb2RlbFdpZGdldF8xPVByb3ZpZGVyCi1TZXJ2aWNlTW9kZWxXaWRnZXRfMj1Db25maWd1cmUuLi4KLVNlcnZpY2VNb2RlbFdpZGdldF8zPVN0YXR1cwotU2VydmljZU1vZGVsV2lkZ2V0XzQ9Tm90IGNvbmZpZ3VyZWQKLVNlcnZpY2VNb2RlbFdpZGdldF81PUNvbmZpZ3VyZWQKLVNlcnZpY2VNb2RlbFdpZGdldF82PUFkZC4uLgotU2VydmljZU1vZGVsV2lkZ2V0Xzc9UmVtb3ZlCi1TZXJ2aWNlTW9kZWxXaWRnZXRfOD1TZXJ2aWNlICJ7MH0iIGhhcyBubyBwcm92aWRlcnNcIQotTmV3U2VydmljZU1vZGVsV2lkZ2V0RGlhbG9nX3RpdGxlPUVkaXQgU2VydmljZSBDb25maWd1cmF0aW9uCi1TZXJ2aWNlc0RpYWxvZ18wPUF2YWlsYWJsZSBTZXJ2aWNlcwotU2VydmljZXNEaWFsb2dfMT1TZWxlY3QgYSBzZXJ2aWNlIHRvIGFkZCB0byB0aGUgY29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS9wcmVmZXJlbmNlcy9TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3ByZWZlcmVuY2VzL1NlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0MDFjZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3ByZWZlcmVuY2VzL1NlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkud2l6YXJkcy5TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHByZWZlcmVuY2UgcGFnZSB3aGljaCBjYW4gYmUgdXNlZCB0byB2aWV3IGEgbGlzdCBvZgotICogc2VydmljZSBjb25maWd1cmF0aW9ucywgdG8gY3JlYXRlIG5ldyBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zIG9yIHRvIGRlbGV0ZQotICogZXhpc3Rpbmcgc2VydmljZSBjb25maWd1cmF0aW9ucy4gVGhpcyBwYWdlIGFsc28gZGlzcGxheXMgYSBsaXN0IG9mIHByb2plY3RzCi0gKiB1c2luZyBhIHNlcnZpY2UgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBkYXZlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQotCQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JLyoqCi0JICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBJQ2VsbE1vZGlmaWVyIHJlcXVpcmVkIGluIG9yZGVyIHRvIG1ha2UgdGhlCi0JICogc2VydmljZSBjb25maWd1cmF0aW9uIHRhYmxlIGVkaXRhYmxlLgotCSAqIAotCSAqIEBhdXRob3IgZGF2ZQotCSAqIAotCSAqLwotCXByaXZhdGUgY2xhc3MgQ29uZmlnQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjY2FuTW9kaWZ5KGphdmEubGFuZy5PYmplY3QsCi0JCSAqIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJLy8gVGhlIHRhYmxlIGlzIGEgc2luZ2xlIGNvbHVtbiB0YWJsZSB3aGljaCBpcyBhbHdheXMgZWRpdGFibGUuCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUKLQkJICogb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCS8vIFJldHVybiB0aGUgZXhpc3RpbmcgbmFtZSBvZiB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uLiBUaGlzIHdheSwKLQkJCS8vIElmIHRoZSB1c2VyIGlzIGp1c3QgY2xpY2tpbmcgb24gc2VydmljZSBjb25maWd1cmF0aW9uIG5hbWVzLCB0aGVuCi0JCQkvLyB3ZSBkb24ndCBjbG9iYmVyIGV4aXN0aW5nIG5hbWVzLgotCQkJcmV0dXJuICgoSVNlcnZpY2VDb25maWd1cmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNtb2RpZnkoamF2YS5sYW5nLk9iamVjdCwKLQkJICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQlUYWJsZUl0ZW0gaXRlbTsKLQkJCS8vIFVwZGF0ZSB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIG5hbWUgd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWUKLQkJCWl0ZW0gPSAoVGFibGVJdGVtKSBlbGVtZW50OwotCQkJY29uZmlnID0gKElTZXJ2aWNlQ29uZmlndXJhdGlvbikgaXRlbS5nZXREYXRhKCk7Ci0JCQljb25maWcuc2V0TmFtZSgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQlpdGVtLnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHdpZGdldCBzZWxlY3Rpb24gZXZlbnRzIGZvciB0aGlzIHBhZ2UKLQkgKiAKLQkgKiBAYXV0aG9yIGRhdmUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEV2ZW50SGFuZGxlciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEhhbmRsZSBzZWxlY3Rpb24gZXZlbnRzIGZvciB3aWRnZXRzIGluIHRoaXMgcGFnZQotCQkgKiAKLQkJICogQHBhcmFtIGUKLQkJICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uIGV2ZW50IHRvIGJlIGhhbmRsZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2U7Ci0KLQkJCXNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IGFkZEJ1dHRvbikgewotCQkJCWFkZFNlcnZpY2VDb25maWd1cmF0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSBlZGl0QnV0dG9uKSB7Ci0JCQkJZWRpdFNlcnZpY2VDb25maWd1cmF0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSByZW1vdmVCdXR0b24pIHsKLQkJCQlyZW1vdmVTZXJ2aWNlQ29uZmlndXJhdGlvbigpOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZSkgewotCQkJCXNldFNlbGVjdGVkQ29uZmlnKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENvbXBhcmF0b3IgY2xhc3MgdXNlZCB0byBzb3J0IHByb2plY3RzIGluIGFzY2VuZGluZyBvcmRlciBieSBuYW1lCi0JICogCi0JICogQGF1dGhvciBkYXZlCi0JICogCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcm9qZWN0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gKChJUHJvamVjdCkgbzEpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJCSgoSVByb2plY3QpIG8yKS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyYXRvciBjbGFzcyB1c2VkIHRvIHNvcnQgc2VydmljZSBjb25maWd1cmF0aW9ucyBpbiBhc2NlbmRpbmcgb3JkZXIKLQkgKiBieSBuYW1lCi0JICogCi0JICogQGF1dGhvciBkYXZlCi0JICogCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoSVNlcnZpY2VDb25maWd1cmF0aW9uKSBvMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygKLQkJCQkJKChJU2VydmljZUNvbmZpZ3VyYXRpb24pIG8yKS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQ29uZmlnQ2VsbE1vZGlmaWVyIGNvbmZpZ0NlbGxNb2RpZmllcjsKLQlwcml2YXRlIExpc3Q8SVNlcnZpY2VDb25maWd1cmF0aW9uPiBkZWxldGVkU2VydmljZUNvbmZpZ3VyYXRpb25zID0gbmV3IEFycmF5TGlzdDxJU2VydmljZUNvbmZpZ3VyYXRpb24+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJU2VydmljZUNvbmZpZ3VyYXRpb24+IGFkZGVkU2VydmljZUNvbmZpZ3VyYXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJU2VydmljZUNvbmZpZ3VyYXRpb24+KCk7Ci0JcHJpdmF0ZSBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcml2YXRlIEV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7Ci0JcHJpdmF0ZSBUYWJsZUNvbHVtbiBwcm9qZWN0Q29sdW1uOwotCXByaXZhdGUgUHJvamVjdENvbXBhcmF0b3IgcHJvamVjdENvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBUYWJsZSBwcm9qZWN0VGFibGU7Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgSVNlcnZpY2VDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFRhYmxlSXRlbSBzZWxlY3RlZFRhYmxlSXRlbTsKLQlwcml2YXRlIFRhYmxlQ29sdW1uIHNlcnZpY2VDb25maWd1cmF0aW9uQ29sdW1uOwotCXByaXZhdGUgU2VydmljZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yIHNlcnZpY2VDb25maWd1cmF0aW9uQ29tcGFyYXRvcjsKLQlwcml2YXRlIFRhYmxlIHNlcnZpY2VDb25maWd1cmF0aW9uVGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzZXJ2aWNlQ29uZmlndXJhdGlvblZpZXdlcjsKLQotCXB1YmxpYyBTZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlKFN0cmluZyB0aXRsZSkgewotCQlzdXBlcih0aXRsZSk7Ci0JfQotCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHRpdGxlLAotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCXN1cGVyKHRpdGxlLCBpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgc2VydmljZSBjb25maWd1cmF0aW9uIHRvIHRoZSBzZXQgb2Ygc2VydmljZSBjb25maWd1cmF0aW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTZXJ2aWNlQ29uZmlndXJhdGlvbigpIHsKLQkJSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJaW50IHN0YXR1czsKLQotCQkvLyBDcmVhdGUgYSBuZXcgc2VydmljZSBjb25maWd1cmF0aW9uIHRoZW4gaW52b2tlIHRoZSBzZXJ2aWNlCi0JCS8vIGNvbmZpZ3VyYXRpb24gd2l6YXJkIHVzaW5nCi0JCS8vIHRoaXMgc2VydmljZSBjb25maWd1cmF0aW9uLiBJZiB0aGUgdXNlciBwcmVzc2VzIG9rLCB0aGVuIGFkZCBhIG5ldwotCQkvLyBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gdG8KLQkJLy8gdGhlIGxpc3QuCi0JCWNvbmZpZyA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5uZXdTZXJ2aWNlQ29uZmlndXJhdGlvbigKLQkJCQlNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzYpOwotCQlTZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmQoCi0JCQkJY29uZmlnKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJc3RhdHVzID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHN0YXR1cyA9PSBXaW5kb3cuT0spIHsKLQkJCVRhYmxlSXRlbSBpdGVtOwotCi0JCQlpdGVtID0gbmV3IFRhYmxlSXRlbShzZXJ2aWNlQ29uZmlndXJhdGlvblRhYmxlLCAwKTsKLQkJCWl0ZW0uc2V0RGF0YShjb25maWcpOwotCQkJaXRlbS5zZXRUZXh0KDAsIGNvbmZpZy5nZXROYW1lKCkpOwotCQkJYWRkZWRTZXJ2aWNlQ29uZmlndXJhdGlvbnMucHV0KGNvbmZpZy5nZXRJZCgpLCBjb25maWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250ZW50cyBmb3IgdGhpcyBwYWdlCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgLSBUaGUgcGFyZW50IHdpZGdldCBmb3IgdGhlIGNsaWVudCBhcmVhCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIG1haW5QYW5lOwotCi0JCW1haW5QYW5lID0gY3JlYXRlV2lkZ2V0cyhwYXJlbnQpOwotCQlwb3B1bGF0ZVNlcnZpY2VDb25maWd1cmF0aW9uTGlzdCgpOwotCQlyZXR1cm4gbWFpblBhbmU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSB3aWRnZXRzIGZvciB0aGlzIHBhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHdpZGdldCBmb3IgdGhlIGNsaWVudCBhcmVhCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVXaWRnZXRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQ7Ci0JCUNvbXBvc2l0ZSBwcmVmZXJlbmNlUGFuZTsKLQkJQ29tcG9zaXRlIGJ1dHRvblBhbmU7Ci0JCVRleHRDZWxsRWRpdG9yIGNvbmZpZ0VkaXRvcltdOwotCQlTdHJpbmcgY29uZmlnUHJvcGVydGllc1tdOwotCQlHcmlkRGF0YSBsYXlvdXREYXRhOwotCQlSb3dMYXlvdXQgYnV0dG9uTGF5b3V0OwotCi0JCWV2ZW50SGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXIoKTsKLQotCQlwcmVmZXJlbmNlUGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJcHJlZmVyZW5jZVBhbmUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZSA9IG5ldyBUYWJsZShwcmVmZXJlbmNlUGFuZSwgU1dULlNJTkdMRSk7Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRIYW5kbGVyKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlzZXJ2aWNlQ29uZmlndXJhdGlvblRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCi0JCXNlcnZpY2VDb25maWd1cmF0aW9uQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHNlcnZpY2VDb25maWd1cmF0aW9uVGFibGUsCi0JCQkJU1dULk5PTkUsIDApOwotCQlzZXJ2aWNlQ29uZmlndXJhdGlvbkNvbHVtbgotCQkJCS5zZXRUZXh0KE1lc3NhZ2VzLlNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2VfMCk7Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uQ29sdW1uLnBhY2soKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25WaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZSk7Ci0KLQkJY29uZmlnRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yWzFdOwotCQljb25maWdFZGl0b3JbMF0gPSBuZXcgVGV4dENlbGxFZGl0b3Ioc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZSk7Ci0JCWNvbmZpZ1Byb3BlcnRpZXMgPSBuZXcgU3RyaW5nWzFdOwotCQljb25maWdQcm9wZXJ0aWVzWzBdID0gTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25QcmVmZXJlbmNlUGFnZV8xOwotCi0JCWNvbmZpZ0NlbGxNb2RpZmllciA9IG5ldyBDb25maWdDZWxsTW9kaWZpZXIoKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25WaWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKGNvbmZpZ0NlbGxNb2RpZmllcik7Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uVmlld2VyLnNldENlbGxFZGl0b3JzKGNvbmZpZ0VkaXRvcik7Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoY29uZmlnUHJvcGVydGllcyk7Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRIYW5kbGVyKTsKLQotCQlwcm9qZWN0VGFibGUgPSBuZXcgVGFibGUocHJlZmVyZW5jZVBhbmUsIFNXVC5TSU5HTEUpOwotCQlwcm9qZWN0VGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJcHJvamVjdFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJcHJvamVjdFRhYmxlLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0KLQkJcHJvamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwcm9qZWN0VGFibGUsIFNXVC5OT05FLCAwKTsKLQkJcHJvamVjdENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLlNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2VfMik7Ci0JCXByb2plY3RDb2x1bW4ucGFjaygpOwotCi0JCWJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKHByZWZlcmVuY2VQYW5lLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkxheW91dCA9IG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKTsKLQkJYnV0dG9uTGF5b3V0LmZpbGwgPSB0cnVlOwotCQlidXR0b25MYXlvdXQuY2VudGVyID0gZmFsc2U7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0KLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlNlcnZpY2VDb25maWd1cmF0aW9uUHJlZmVyZW5jZVBhZ2VfMyk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudEhhbmRsZXIpOwotCQllZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lLCBTV1QuUFVTSCk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzQpOwotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50SGFuZGxlcik7Ci0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFuZSwgU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblByZWZlcmVuY2VQYWdlXzUpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRIYW5kbGVyKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXJldHVybiBwcmVmZXJlbmNlUGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQvcmVtb3ZlIHNlbGVjdGVkIHNlcnZpY2UgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgc2V0IG9mIHNlcnZpY2UKLQkgKiBjb25maWd1cmF0aW9ucyBrbm93biB0byB0aGUgc2VydmljZSBtb2RlbCBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlcnZpY2VDb25maWd1cmF0aW9ucygpIHsKLQkJZm9yIChJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnIDogZGVsZXRlZFNlcnZpY2VDb25maWd1cmF0aW9ucykgewotCQkJaWYgKGFkZGVkU2VydmljZUNvbmZpZ3VyYXRpb25zLmNvbnRhaW5zS2V5KGNvbmZpZy5nZXRJZCgpKSkgewotCQkJCWFkZGVkU2VydmljZUNvbmZpZ3VyYXRpb25zLnJlbW92ZShjb25maWcuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCVNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoY29uZmlnKTsKLQkJCX0KLQkJfQotCQlkZWxldGVkU2VydmljZUNvbmZpZ3VyYXRpb25zLmNsZWFyKCk7Ci0JCWZvciAoSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZyA6IGFkZGVkU2VydmljZUNvbmZpZ3VyYXRpb25zLnZhbHVlcygpKSB7Ci0JCQlTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRWRpdCBhbiBleGlzdGluZyBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdFNlcnZpY2VDb25maWd1cmF0aW9uKCkgewotCQlTZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQ7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2c7Ci0JCWludCBzdGF0dXM7Ci0KLQkJaWYgKHNlbGVjdGVkQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQl3aXphcmQgPSBuZXcgU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmQoc2VsZWN0ZWRDb25maWd1cmF0aW9uKTsKLQkJCWRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJCXN0YXR1cyA9IGRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHNlcnZpY2UgY29uZmlndXJhdGlvbnMgd2hlbiBBcHBseSBidXR0b24gaXMgcHJlc3NlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJdXBkYXRlU2VydmljZUNvbmZpZ3VyYXRpb25zKCk7Ci0JCXN1cGVyLnBlcmZvcm1BcHBseSgpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zIHdoZW4gT2sgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0YXR1cyBmcm9tIHN1cGVyY2xhc3MgaW5kaWNhdGluZyBpZiBPayBwcm9jZXNzaW5nIGlzIHRvIGNvbnRpbnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQl1cGRhdGVTZXJ2aWNlQ29uZmlndXJhdGlvbnMoKTsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLQotCS8qKgotCSAqIEZpbGwgaW4gdGhlIGxpc3Qgb2Ygc2VydmljZSBjb25maWd1cmF0aW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVNlcnZpY2VDb25maWd1cmF0aW9uTGlzdCgpIHsKLQkJT2JqZWN0IHNlcnZpY2VDb25maWd1cmF0aW9uc1tdOwotCi0JCS8vIEdldCB0aGUgc2VydmljZSBjb25maWd1cmF0aW9ucyBzZXQsIHNvcnQgYnkgbmFtZSBhbmQgdXBkYXRlIHRoZSB0YWJsZQotCQkvLyB3aXRoIHRoZSBsaXN0Ci0JCXNlcnZpY2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciA9IG5ldyBTZXJ2aWNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IoKTsKLQkJc2VydmljZUNvbmZpZ3VyYXRpb25zID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldENvbmZpZ3VyYXRpb25zKCkudG9BcnJheSgpOwotCQlBcnJheXMuc29ydChzZXJ2aWNlQ29uZmlndXJhdGlvbnMsIHNlcnZpY2VDb25maWd1cmF0aW9uQ29tcGFyYXRvcik7Ci0JCWZvciAoT2JqZWN0IGNvbmZpZyA6IHNlcnZpY2VDb25maWd1cmF0aW9ucykgewotCQkJVGFibGVJdGVtIGl0ZW07Ci0KLQkJCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHNlcnZpY2VDb25maWd1cmF0aW9uVGFibGUsIDApOwotCQkJaXRlbS5zZXREYXRhKGNvbmZpZyk7Ci0JCQlpdGVtLnNldFRleHQoMCwgKChJU2VydmljZUNvbmZpZ3VyYXRpb24pIGNvbmZpZykuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc2VsZWN0ZWQgc2VydmljZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHNldCBvZiBzZXJ2aWNlCi0JICogY29uZmlndXJhdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU2VydmljZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWludCBpZHg7Ci0KLQkJaWR4ID0gc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZS5pbmRleE9mKHNlbGVjdGVkVGFibGVJdGVtKTsKLQkJaWYgKGlkeCAhPSAtMSkgewotCQkJaW50IGl0ZW1Db3VudDsKLQotCQkJc2VydmljZUNvbmZpZ3VyYXRpb25UYWJsZS5yZW1vdmUoaWR4KTsKLQkJCWlmIChkZWxldGVkU2VydmljZUNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCQlkZWxldGVkU2VydmljZUNvbmZpZ3VyYXRpb25zID0gbmV3IFZlY3RvcjxJU2VydmljZUNvbmZpZ3VyYXRpb24+KCk7Ci0JCQl9Ci0JCQkvLyBBZGQgZGVsZXRlZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gdG8gdmVjdG9yIHRvIGJlIHByb2Nlc3NlZAotCQkJLy8gd2hlbiBBcHBseSBvciBPayBpcyBwcmVzc2VkLgotCQkJZGVsZXRlZFNlcnZpY2VDb25maWd1cmF0aW9ucy5hZGQoc2VsZWN0ZWRDb25maWd1cmF0aW9uKTsKLQkJCWl0ZW1Db3VudCA9IHByb2plY3RUYWJsZS5nZXRJdGVtQ291bnQoKTsKLQkJCWlmIChpdGVtQ291bnQgPiAwKSB7Ci0JCQkJcHJvamVjdFRhYmxlLnJlbW92ZSgwLCBpdGVtQ291bnQgLSAxKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY29yZCB0aGUgc2VsZWN0ZWQgc2VydmljZSBjb25maWd1cmF0aW9uIGFuZCBlbmFibGUgdGhlIGVkaXQgYW5kIHJlbW92ZQotCSAqIHNlcnZpY2UgY29uZmlndXJhdGlvbiBidXR0b25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZENvbmZpZygpIHsKLQkJVGFibGVJdGVtIHNlbGVjdGlvbltdOwotCi0JCXNlbGVjdGlvbiA9IHNlcnZpY2VDb25maWd1cmF0aW9uVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCkgewotCQkJc2VsZWN0ZWRUYWJsZUl0ZW0gPSBzZWxlY3Rpb25bMF07Ci0JCQlzZWxlY3RlZENvbmZpZ3VyYXRpb24gPSAoSVNlcnZpY2VDb25maWd1cmF0aW9uKSBzZWxlY3RlZFRhYmxlSXRlbQotCQkJCQkuZ2V0RGF0YSgpOwotCQkJc2hvd1Byb2plY3RzRm9yQ29uZmlndXJhdGlvbihzZWxlY3RlZENvbmZpZ3VyYXRpb24pOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGxpc3Qgb2YgcHJvamVjdHMgdXNpbmcgdGhlIHNlbGVjdGVkIHNlcnZpY2UgY29uZmlndXJhdGlvbiwgc29ydAotCSAqIGJ5IHByb2plY3QgbmFtZSB0aGVuIHVwZGF0ZSB0aGUgcHJvamVjdCB0YWJsZSB3aXRoIHRoZSBsaXN0IG9mIHByb2plY3RzCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93UHJvamVjdHNGb3JDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJT2JqZWN0IHByb2plY3RzW107Ci0KLQkJcHJvamVjdENvbXBhcmF0b3IgPSBuZXcgUHJvamVjdENvbXBhcmF0b3IoKTsKLQkJcHJvamVjdHMgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJvamVjdHNGb3JDb25maWd1cmF0aW9uKGNvbmZpZykudG9BcnJheSgpOwotCQlBcnJheXMuc29ydChwcm9qZWN0cywgcHJvamVjdENvbXBhcmF0b3IpOwotCQlwcm9qZWN0VGFibGUucmVtb3ZlQWxsKCk7Ci0JCWZvciAoT2JqZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotCQkJVGFibGVJdGVtIGl0ZW07Ci0KLQkJCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHByb2plY3RUYWJsZSwgMCk7Ci0JCQlpdGVtLnNldFRleHQoKChJUHJvamVjdCkgcHJvamVjdCkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS92aWV3cy9TZXJ2aWNlQ29uZmlndXJhdGlvblZpZXcuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvdmlld3MvU2VydmljZUNvbmZpZ3VyYXRpb25WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDk4M2YuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS92aWV3cy9TZXJ2aWNlQ29uZmlndXJhdGlvblZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRm9udERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuTG9jYWxSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbEV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUNvbmZpZ3VyYXRpb25WaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCi0JLyoqCi0JICogTGlzdGVuZXIgZm9yIHNlcnZpY2UgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gZXZlbnRzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZXJ2aWNlTW9kZWxFdmVudExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVNlcnZpY2VNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQlyZWZyZXNoVmlld2VyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIHsKLQkJCi0JCXByaXZhdGUgRm9udCBzZWxlY3RlZEZvbnQ7Ci0JCXByaXZhdGUgRm9udCB1blNlbGVjdGVkRm9udDsKLQkJCi0JCXB1YmxpYyBTZXJ2aWNlQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoRm9udCBmb250KSB7Ci0JCQl1blNlbGVjdGVkRm9udCA9IGZvbnQ7Ci0JCQlGb250RGF0YSBmZCA9IGZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJCUZvbnREYXRhIHNlbGVjdGVkRm9udERhdGEgPSBuZXcgRm9udERhdGEoZmQuZ2V0TmFtZSgpLCBmZC5nZXRIZWlnaHQoKSwgU1dULkJPTEQpOwotCQkJc2VsZWN0ZWRGb250ID0gKEZvbnQpbmV3IExvY2FsUmVzb3VyY2VNYW5hZ2VyKEpGYWNlUmVzb3VyY2VzLmdldFJlc291cmNlcygpKS5nZXQoRm9udERlc2NyaXB0b3IuY3JlYXRlRnJvbShzZWxlY3RlZEZvbnREYXRhKSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQkJSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmYgPSBnZXRTZXJ2aWNlQ29uZmlndXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChjb25mICE9IG51bGwgJiYgY29uZiA9PSBmTWFuYWdlci5nZXRBY3RpdmVDb25maWd1cmF0aW9uKCkpIHsKLQkJCQlyZXR1cm4gc2VsZWN0ZWRGb250OwotCQkJfQotCQkJcmV0dXJuIHVuU2VsZWN0ZWRGb250OwotCQl9Ci0JCQotCQlwcml2YXRlIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBnZXRTZXJ2aWNlQ29uZmlndXJhdGlvbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmYgPSBudWxsOwotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJY29uZiA9IChJU2VydmljZUNvbmZpZ3VyYXRpb24pICgoSUFkYXB0YWJsZSkgcGFyZW50RWxlbWVudCkuZ2V0QWRhcHRlcihJU2VydmljZUNvbmZpZ3VyYXRpb24uY2xhc3MpOwotCQkJfQotCQkJcmV0dXJuIGNvbmY7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIElTZXJ2aWNlTW9kZWxNYW5hZ2VyIGZNYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uVmlldygpIHsKLQkJZk1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihuZXcgU2VydmljZU1vZGVsRXZlbnRMaXN0ZW5lcigpLCAKLQkJCQlJU2VydmljZU1vZGVsRXZlbnQuU0VSVklDRV9DT05GSUdVUkFUSU9OX1NFTEVDVEVEIHwKLQkJCQlJU2VydmljZU1vZGVsRXZlbnQuU0VSVklDRV9DT05GSUdVUkFUSU9OX0FEREVEIHwKLQkJCQlJU2VydmljZU1vZGVsRXZlbnQuU0VSVklDRV9DT05GSUdVUkFUSU9OX1JFTU9WRUQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZlZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJKTsKLQkJZlZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJZlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTZXJ2aWNlQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoZlZpZXdlci5nZXRUcmVlKCkuZ2V0Rm9udCgpKSk7Ci0KLQkJZlZpZXdlci5zZXRJbnB1dChTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0JCWNyZWF0ZUNvbnRleHRNZW51KCk7Ci0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBFbmFibGUgcHJvcGVydHkgc2hlZXQgdXBkYXRlcyB3aGVuIHRyZWUgaXRlbXMgYXJlIHNlbGVjdGVkLgotCQkvLyBOb3RlIGZvciB0aGlzIHRvIHdvcmsgZWFjaCBpdGVtIGluIHRoZSB0cmVlIG11c3QgZWl0aGVyIGltcGxlbWVudAotCQkvLyBJUHJvcGVydHlTb3VyY2UsIG9yIHN1cHBvcnQgSVByb3BlcnR5U291cmNlLmNsYXNzIGFzIGFuIGFkYXB0ZXIgdHlwZQotCQkvLyBpbiBpdHMgQWRhcHRlckZhY3RvcnkuCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGZWaWV3ZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBGb250IGdldEZvbnQoKSB7Ci0JCWlmIChmVmlld2VyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmVmlld2VyLmdldFRyZWUoKS5nZXRGb250KCk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgdHJlZSB2aWV3ZXIgd2hlbiB0aGUgbW9kZWwgY2hhbmdlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hWaWV3ZXIoKSB7Ci0JCWZWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZlZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWZWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcG9wdXAgbWVudQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZXh0TWVudSgpIHsKLQkJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiLCAib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLnZpZXdzLnNlcnZpY2VDb25maWd1cmF0aW9uVmlldy5jb250ZXh0TWVudSIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZlZpZXdlci5nZXRDb250cm9sKCkpOwotCQlmVmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWFuYWdlciwgZlZpZXdlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aWRnZXRzL05ld1NlcnZpY2VNb2RlbFdpZGdldC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aWRnZXRzL05ld1NlcnZpY2VNb2RlbFdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDk1MGRkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2lkZ2V0cy9OZXdTZXJ2aWNlTW9kZWxXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpZGdldHM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmludGVybmFsLmNvcmUuU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuU2VydmljZU1vZGVsVUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi1wdWJsaWMgY2xhc3MgTmV3U2VydmljZU1vZGVsV2lkZ2V0IGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkKLQkvLyBLZXlzIGZvciBkYXRhIGF0dGFjaGVkIHRvIFRyZWVJdGVtcyB0aGF0IHJlcHJlc2VudCBzZXJ2aWNlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0tFWSA9ICJzZXJ2aWNlIjsgICAvLyBJU2VydmljZSAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0tFWSA9ICJkaXNhYmxlZCI7IC8vIEJvb2xlYW4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9LRVkgPSAicHJvdmlkZXIiOyAvLyBJU2VydmljZVByb3ZpZGVyIC8vJE5PTi1OTFMtMSQKLQkKLQotCXByaXZhdGUgSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIFRyZWUgc2VydmljZXNUcmVlOwotCXByaXZhdGUgQnV0dG9uIGVuYWJsZWRDaGVja2JveDsKLQlwcml2YXRlIENvbWJvIHByb3ZpZGVyQ29tYm87Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29uZmlndXJhdGlvbkNvbXBvc2l0ZTsKLQlwcml2YXRlIENvbXBvc2l0ZSBwcm92aWRlckNvbXBvc2l0ZTsKLQlwcml2YXRlIFN0YWNrTGF5b3V0IHN0YWNrTGF5b3V0OwotCQotCXByaXZhdGUgSW1hZ2UgZW5hYmxlZEljb247Ci0JcHJpdmF0ZSBJbWFnZSBkaXNhYmxlZEljb247Ci0JcHJpdmF0ZSBJbWFnZSBjb25maWdJY29uOwotCQotCXByaXZhdGUgTWFwPFN0cmluZyxJU2VydmljZVByb3ZpZGVyPiBwcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxJU2VydmljZVByb3ZpZGVyPigpOwotCQotCQotCXB1YmxpYyBOZXdTZXJ2aWNlTW9kZWxXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLk5ld1NlcnZpY2VNb2RlbFdpZGdldF8wKTsKLQkJCi0JCUxhYmVsIGZpbGxlciA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7IAotCQlmaWxsZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWZpbGxlci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJQ29tcG9zaXRlIGxlZnQgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWxlZnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsZWZ0LnNldExheW91dChsYXlvdXQpOwotCQkKLQkJc2VydmljZXNUcmVlID0gbmV3IFRyZWUobGVmdCwgU1dULkJPUkRFUiAgfCBTV1QuU0lOR0xFKTsKLQkJc2VydmljZXNUcmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJc2VydmljZXNUcmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkaXNwbGF5U2VydmljZShzZXJ2aWNlc1RyZWUuZ2V0U2VsZWN0aW9uKClbMF0pOwotCQkJfQotCQl9KTsKLQkJCi0JCXByb3ZpZGVyQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCXByb3ZpZGVyQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwcm92aWRlckNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJCi0JCWVuYWJsZWRDaGVja2JveCA9IG5ldyBCdXR0b24ocHJvdmlkZXJDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZWRDaGVja2JveC5zZXRUZXh0KE1lc3NhZ2VzLk5ld1NlcnZpY2VNb2RlbFdpZGdldF8xKTsKLQkJZW5hYmxlZENoZWNrYm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQllbmFibGVkQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGVuYWJsZWRDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQljaGFuZ2VTZXJ2aWNlU3RhdGUoIWNoZWNrZWQpOwotCQkJfQotCQl9KTsKLQkJZW5hYmxlZENoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJTGFiZWwgcHJvdmlkZXIgPSBuZXcgTGFiZWwocHJvdmlkZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvdmlkZXIuc2V0VGV4dChNZXNzYWdlcy5OZXdTZXJ2aWNlTW9kZWxXaWRnZXRfMik7Ci0JCXByb3ZpZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlwcm92aWRlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCXByb3ZpZGVyQ29tYm8gPSBuZXcgQ29tYm8ocHJvdmlkZXJDb21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDI1MDsKLQkJcHJvdmlkZXJDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwcm92aWRlckNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yW10pIHByb3ZpZGVyQ29tYm8uZ2V0RGF0YSgpOwotCQkJCXNlbGVjdFByb3ZpZGVyKGRlc2NyaXB0b3JzW3Byb3ZpZGVyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotCQkJfQotCQl9KTsKLQkJcHJvdmlkZXJDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwcm92aWRlckNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5TSEFET1dfT1VUIHwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQljb25maWd1cmF0aW9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwcm92aWRlckNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljb25maWd1cmF0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCXN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXN0YWNrTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29uZmlndXJhdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoc3RhY2tMYXlvdXQpOwotCi0JCS8vIFRPRE8gbWFrZSB0aGlzIGJldHRlciB1c2luZyBhbiBJbWFnZVJlZ2lzdHJ5Ci0JCWVuYWJsZWRJY29uICA9IG5ldyBJbWFnZShnZXREaXNwbGF5KCksIGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL2ljb25zL2V0b29sMTYvc2VydmljZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlzYWJsZWRJY29uID0gbmV3IEltYWdlKGdldERpc3BsYXkoKSwgZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvaWNvbnMvZXRvb2wxNi9zZXJ2aWNlLWRpc2FibGVkLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWdJY29uICAgPSBuZXcgSW1hZ2UoZ2V0RGlzcGxheSgpLCBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi9pY29ucy9ldG9vbDE2L3NlcnZpY2UtY2F0ZWdvcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlhZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZW5hYmxlZEljb24uZGlzcG9zZSgpOwotCQkJCWRpc2FibGVkSWNvbi5kaXNwb3NlKCk7Ci0JCQkJY29uZmlnSWNvbi5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBDYXVzZXMgdGhlIHRyZWUgdG8gZGlzcGxheSBhbGwgdGhlIHNlcnZpY2VzIHRoYXQgYXJlIGF2YWlsYWJsZQotCSAqIGluIHRoZSBzeXN0ZW0uIFNlcnZpY2VzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBnaXZlbiBzZXJ2aWNlCi0JICogY29uZmlndXJhdGlvbiB3aWxsIGJlIHNob3duIGFzIGRpc2FibGVkLiBTZXJ2aWNlcyB0aGF0IGFyZSBwYXJ0Ci0JICogb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gd2lsbCBzaG93IGFzIGVuYWJsZWQuCi0JICogCi0JICogQW55IGNoYW5nZXMgbWFkZSBieSB0aGUgdXNlciB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiAKLQkgKiB3aGVuIHRoZSBhcHBseUNoYW5nZXNUb0NvbmZpZ3VyYXRpb24oKSBtZXRob2QgaXMgY2FsbGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25mKSB7Ci0JCXNldFNlcnZpY2VDb25maWd1cmF0aW9uKGNvbmYsIG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogQ2F1c2VzIHRoZSB0cmVlIHRvIGRpc3BsYXkgYWxsIHRoZSBzZXJ2aWNlcyB0aGF0IGFyZSBhdmFpbGFibGUKLQkgKiBpbiB0aGUgc3lzdGVtLiBTZXJ2aWNlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgZ2l2ZW4gc2VydmljZQotCSAqIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBzaG93biBhcyBkaXNhYmxlZC4gU2VydmljZXMgdGhhdCBhcmUgcGFydAotCSAqIG9mIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIHdpbGwgc2hvdyBhcyBlbmFibGVkLgotCSAqIAotCSAqIEFueSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHVzZXIgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gCi0JICogd2hlbiB0aGUgYXBwbHlDaGFuZ2VzVG9Db25maWd1cmF0aW9uKCkgbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBBZGRpdGlvbmFsbHkgdGhlIHNlcnZpY2VzIHRyZWUgd2lsbCBiZSBmaWx0ZXJlZCB0byBleGNsdWRlIHNlcnZpY2VzCi0JICogdGhhdCBkbyBub3QgYXBwbHkgdG8gdGhlIGdpdmVuIHNldCBvZiBwcm9qZWN0IG5hdHVyZSBJRHMuIFRoaXMgaXMKLQkgKiB1c2VmdWwgd2hlbiB0aGUgd2lkZ2V0IGlzIHVzZWQgYXMgcGFydCBvZiBhIHByb2plY3QgcHJvcGVydGllcyBwYWdlCi0JICogYXMgb25seSB0aGUgc2VydmljZXMgdGhhdCBhcHBseSB0byB0aGUgcHJvamVjdCB3aWxsIGJlIHNob3duLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTZXQ8U3RyaW5nPiBuYXR1cmVJZHMpIHsKLQkJdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQkJY3JlYXRlVHJlZUNvbnRlbnQobmF0dXJlSWRzKTsKLQkJZGlzcGxheVNlcnZpY2UobnVsbCk7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZpY2UgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyBkaXNwbGF5ZWQKLQkgKiBieSB0aGlzIHdpZGdldC4gSW4gb3JkZXIgZm9yIHRoZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHVzZXIgdG8gYmUgCi0JICogcmVmbGVjdGVkIGluIHRoZSBjb25maWd1cmF0aW9uIHRoZSBhcHBseUNoYW5nZXNUb0NvbmZpZ3VyYXRpb24oKSBtZXRob2QKLQkgKiBtdXN0IGJlIGNhbGxlZCBmaXJzdC4KLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VDb25maWd1cmF0aW9uIGdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlTZXJ2aWNlKFRyZWVJdGVtIHNlcnZpY2VUcmVlSXRlbSkgewotCQkvLyBFYWNoIHRyZWUgaXRlbSByZXByZXNlbnRzIGEgc2VydmljZQotCQlJU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJaWYoc2VydmljZVRyZWVJdGVtICE9IG51bGwpCi0JCQlzZXJ2aWNlID0gKElTZXJ2aWNlKSBzZXJ2aWNlVHJlZUl0ZW0uZ2V0RGF0YShTRVJWSUNFX0tFWSk7Ci0JCQotCQkvLyBjbGVhciBldmVyeXRoaW5nIG91dAotCQlwcm92aWRlckNvbWJvLnJlbW92ZUFsbCgpOwotCQlmb3IoQ29udHJvbCBjaGlsZCA6IHByb3ZpZGVyQ29tcG9zaXRlLmdldENoaWxkcmVuKCkpCi0JCQljaGlsZC5zZXRFbmFibGVkKHNlcnZpY2UgIT0gbnVsbCk7Ci0JCQotCQkvLyBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGNhdGVnb3J5IG5vZGUgdGhlbiBjbGVhciBvdXQgdGhlIGNvbXBvc2l0ZSB0b28gYW5kIHF1aXQKLQkJaWYoc2VydmljZSA9PSBudWxsKSB7Ci0JCQlzdGFja0xheW91dC50b3BDb250cm9sID0gbnVsbDsKLQkJCWNvbmZpZ3VyYXRpb25Db21wb3NpdGUubGF5b3V0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGdldCB0aGUgc2VydmljZSBwcm92aWRlciB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkCi0JCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIgPSAoSVNlcnZpY2VQcm92aWRlcikgc2VydmljZVRyZWVJdGVtLmdldERhdGEoUFJPVklERVJfS0VZKTsKLQkJaWYocHJvdmlkZXIgPT0gbnVsbCAmJiAhY29uZmlndXJhdGlvbi5pc0Rpc2FibGVkKHNlcnZpY2UpKSB7Ci0JCQlwcm92aWRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0U2VydmljZVByb3ZpZGVyKHNlcnZpY2UpOwotCQl9Ci0JCQotCQkvLyBwb3B1bGF0ZSB0aGUgcHJvdmlkZXIgY29tYm8KLQkJU2V0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPiBwcm92aWRlcnMgPSBzZXJ2aWNlLmdldFByb3ZpZGVycygpOwotCQkvLyBpdCdzIHBvc3NpYmxlIHRoZXJlIGFyZSBubyBwcm92aWRlcnMKLQkJaWYgKHByb3ZpZGVycy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBwcm92aWRlcnMudG9BcnJheShuZXcgSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3JbMF0pOwotCQlBcnJheXMuc29ydChkZXNjcmlwdG9ycywgUFJPVklERVJfQ09NUEFSQVRPUik7Ci0JCQotCQlpbnQgc2VsZWN0aW9uID0gMDsKLQkJZm9yKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm92aWRlckNvbWJvLmFkZChkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOwotCQkJaWYocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlci5nZXRJZCgpLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXRJZCgpKSkKLQkJCQlzZWxlY3Rpb24gPSBpOwotCQl9Ci0JCXByb3ZpZGVyQ29tYm8uc2V0RGF0YShkZXNjcmlwdG9ycyk7Ci0JCXByb3ZpZGVyQ29tYm8uc2VsZWN0KHNlbGVjdGlvbik7Ci0JCQotCQkvLyBzZXQgdGhlIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUgYXBwcm9wcmlhdGVseQotCQlib29sZWFuIGRpc2FibGVkID0gQm9vbGVhbi5UUlVFLmVxdWFscyhzZXJ2aWNlVHJlZUl0ZW0uZ2V0RGF0YShESVNBQkxFRF9LRVkpKTsKLQkJcHJvdmlkZXJDb21iby5zZXRFbmFibGVkKCFkaXNhYmxlZCk7Ci0JCWVuYWJsZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oIWRpc2FibGVkKTsKLQkJCi0JCWlmKGRpc2FibGVkKSB7Ci0JCQkvLyB0aGlzIGlzIGVhc2llciB0aGFuIGRpc2FibGluZyB0aGUgcHJvdmlkZXIgY29tcG9zaXRlCi0JCQlzdGFja0xheW91dC50b3BDb250cm9sID0gbnVsbDsKLQkJCWNvbmZpZ3VyYXRpb25Db21wb3NpdGUubGF5b3V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWxlY3RQcm92aWRlcihkZXNjcmlwdG9yc1tzZWxlY3Rpb25dKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0UHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlUcmVlSXRlbSBzZXJ2aWNlVHJlZUl0ZW0gPSBzZXJ2aWNlc1RyZWUuZ2V0U2VsZWN0aW9uKClbMF07Ci0JCUlTZXJ2aWNlUHJvdmlkZXIgbmV3UHJvdmlkZXIgPSBwcm92aWRlck1hcC5nZXQoZGVzY3JpcHRvci5nZXRJZCgpKTsKLQkJaWYobmV3UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbmV3UHJvdmlkZXIgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2VydmljZVByb3ZpZGVyKGRlc2NyaXB0b3IpOwotCQkJcHJvdmlkZXJNYXAucHV0KG5ld1Byb3ZpZGVyLmdldElkKCksIG5ld1Byb3ZpZGVyKTsKLQkJCQotCQkJSVNlcnZpY2Ugc2VydmljZSA9IChJU2VydmljZSkgc2VydmljZVRyZWVJdGVtLmdldERhdGEoU0VSVklDRV9LRVkpOwotCQkJSVNlcnZpY2VQcm92aWRlciBleGlzdGluZ1Byb3ZpZGVyID0gZ2V0RXhpc3RpbmdQcm92aWRlcihuZXdQcm92aWRlci5nZXRJZCgpLCBzZXJ2aWNlKTsKLQkJCWlmKGV4aXN0aW5nUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWZvcihTdHJpbmcga2V5IDogZXhpc3RpbmdQcm92aWRlci5rZXlTZXQoKSkgewotCQkJCQluZXdQcm92aWRlci5wdXRTdHJpbmcoa2V5LCBleGlzdGluZ1Byb3ZpZGVyLmdldFN0cmluZyhrZXksIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXNlcnZpY2VUcmVlSXRlbS5zZXREYXRhKFBST1ZJREVSX0tFWSwgbmV3UHJvdmlkZXIpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbmZpZ3VyYXRpb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlTZXJ2aWNlTW9kZWxVSU1hbmFnZXIgdWltID0gU2VydmljZU1vZGVsVUlNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCUlTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciBjb250cmlidXRvciA9IHVpbS5nZXRTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvcihkZXNjcmlwdG9yKTsKLQkJCi0JCWlmKGNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWNvbnRyaWJ1dG9yLmNvbmZpZ3VyZVNlcnZpY2VQcm92aWRlcihuZXdQcm92aWRlciwgY29tcCk7Ci0JCX0KLQkJCi0JCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBjb21wOwotCQljb25maWd1cmF0aW9uQ29tcG9zaXRlLmxheW91dCgpOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSBwcm92aWRlciBpZiB0aGVyZSBpcyBvbmUgb3IgcmV0dXJucwotCSAqIG9uZSBvZiB0aGUgZm9ybWVyIHByb3ZpZGVycyBpZiBwb3NzaWJsZS4KLQkgKi8KLQlwcml2YXRlIElTZXJ2aWNlUHJvdmlkZXIgZ2V0RXhpc3RpbmdQcm92aWRlcihTdHJpbmcgcHJvdmlkZXJJZCwgSVNlcnZpY2Ugc2VydmljZSkgewotCQlJU2VydmljZVByb3ZpZGVyIHNldFByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSk7Ci0JCWlmKHNldFByb3ZpZGVyICE9IG51bGwgJiYgcHJvdmlkZXJJZC5lcXVhbHMoc2V0UHJvdmlkZXIuZ2V0SWQoKSkpCi0JCQlyZXR1cm4gc2V0UHJvdmlkZXI7Ci0JCQotCQlpZihjb25maWd1cmF0aW9uIGluc3RhbmNlb2YgU2VydmljZUNvbmZpZ3VyYXRpb24pIHsKLQkJCWZvcihJU2VydmljZVByb3ZpZGVyIGZvcm1lclByb3ZpZGVyIDogKChTZXJ2aWNlQ29uZmlndXJhdGlvbiljb25maWd1cmF0aW9uKS5nZXRGb3JtZXJTZXJ2aWNlUHJvdmlkZXJzKHNlcnZpY2UpKSB7Ci0JCQkJaWYocHJvdmlkZXJJZC5lcXVhbHMoZm9ybWVyUHJvdmlkZXIuZ2V0SWQoKSkpIHsKLQkJCQkJcmV0dXJuIGZvcm1lclByb3ZpZGVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgY2hhbmdlU2VydmljZVN0YXRlKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJVHJlZUl0ZW0gc2VydmljZVRyZWVJdGVtID0gc2VydmljZXNUcmVlLmdldFNlbGVjdGlvbigpWzBdOwotCQlzZXJ2aWNlVHJlZUl0ZW0uc2V0RGF0YShESVNBQkxFRF9LRVksIGRpc2FibGVkKTsJCQotCQlzZXJ2aWNlVHJlZUl0ZW0uc2V0SW1hZ2UoZGlzYWJsZWQgPyBkaXNhYmxlZEljb24gOiBlbmFibGVkSWNvbik7Ci0JCWRpc3BsYXlTZXJ2aWNlKHNlcnZpY2VUcmVlSXRlbSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlQ29udGVudChTZXQ8U3RyaW5nPiBmaWx0ZXJOYXR1cmVJZHMpIHsKLQkJc2VydmljZXNUcmVlLnJlbW92ZUFsbCgpOwotCQlpZihjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZihmaWx0ZXJOYXR1cmVJZHMgPT0gbnVsbCkKLQkJCWZpbHRlck5hdHVyZUlkcyA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCQotCQlTb3J0ZWRTZXQ8SVNlcnZpY2U+IGRlZmF1bHRDYXRlZ29yeVNlcnZpY2VzID0gbmV3IFRyZWVTZXQ8SVNlcnZpY2U+KFNFUlZJQ0VfQ09NUEFSQVRPUik7Ci0JCVNvcnRlZE1hcDxJU2VydmljZUNhdGVnb3J5LCBTb3J0ZWRTZXQ8SVNlcnZpY2U+PiBjYXRlZ29yeVNlcnZpY2VzID0gbmV3IFRyZWVNYXA8SVNlcnZpY2VDYXRlZ29yeSwgU29ydGVkU2V0PElTZXJ2aWNlPj4oQ0FURUdPUllfQ09NUEFSQVRPUik7Ci0JCQotCQlmb3IoSVNlcnZpY2Ugc2VydmljZSA6IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlcygpKSB7Ci0JCQlpZihmaWx0ZXJPdXQoc2VydmljZS5nZXROYXR1cmVzKCksIGZpbHRlck5hdHVyZUlkcykpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCUlTZXJ2aWNlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBzZXJ2aWNlLmdldENhdGVnb3J5KCk7Ci0JCQlpZihjYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQkJZGVmYXVsdENhdGVnb3J5U2VydmljZXMuYWRkKHNlcnZpY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU29ydGVkU2V0PElTZXJ2aWNlPiBzZXJ2aWNlcyA9IGNhdGVnb3J5U2VydmljZXMuZ2V0KGNhdGVnb3J5KTsKLQkJCQlpZihzZXJ2aWNlcyA9PSBudWxsKSB7Ci0JCQkJCXNlcnZpY2VzID0gbmV3IFRyZWVTZXQ8SVNlcnZpY2U+KFNFUlZJQ0VfQ09NUEFSQVRPUik7Ci0JCQkJCWNhdGVnb3J5U2VydmljZXMucHV0KGNhdGVnb3J5LCBzZXJ2aWNlcyk7Ci0JCQkJfQotCQkJCXNlcnZpY2VzLmFkZChzZXJ2aWNlKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yKE1hcC5FbnRyeTxJU2VydmljZUNhdGVnb3J5LFNvcnRlZFNldDxJU2VydmljZT4+IGVudHJ5IDogY2F0ZWdvcnlTZXJ2aWNlcy5lbnRyeVNldCgpKSB7Ci0JCQlUcmVlSXRlbSBwYXJlbnQgPSBjcmVhdGVUcmVlQ2F0ZWdvcnkoc2VydmljZXNUcmVlLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlmb3IoSVNlcnZpY2Ugc2VydmljZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKLQkJCQljcmVhdGVUcmVlU2VydmljZShwYXJlbnQsIHNlcnZpY2UpOwotCQkJfQotCQkJcGFyZW50LnNldEV4cGFuZGVkKHRydWUpOwotCQl9Ci0JCQotCQlpZighZGVmYXVsdENhdGVnb3J5U2VydmljZXMuaXNFbXB0eSgpKSB7Ci0JCQlUcmVlSXRlbSBwYXJlbnQgPSBjcmVhdGVUcmVlQ2F0ZWdvcnkoc2VydmljZXNUcmVlLCBudWxsKTsKLQkJCWZvcihJU2VydmljZSBzZXJ2aWNlIDogZGVmYXVsdENhdGVnb3J5U2VydmljZXMpIHsKLQkJCQljcmVhdGVUcmVlU2VydmljZShwYXJlbnQsIHNlcnZpY2UpOwotCQkJfQotCQkJcGFyZW50LnNldEV4cGFuZGVkKHRydWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZmlsdGVyT3V0KFNldDxTdHJpbmc+IHNlcnZpY2VJZHMsIFNldDxTdHJpbmc+IGZpbHRlcklkcykgewotCQlpZihzZXJ2aWNlSWRzLmlzRW1wdHkoKSB8fCBmaWx0ZXJJZHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvcihTdHJpbmcgaWQgOiBzZXJ2aWNlSWRzKSB7Ci0JCQlpZihmaWx0ZXJJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIFRyZWVJdGVtIGNyZWF0ZVRyZWVDYXRlZ29yeShUcmVlIHBhcmVudCwgSVNlcnZpY2VDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHNlcnZpY2VzVHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoY2F0ZWdvcnkgPT0gbnVsbCA/IE1lc3NhZ2VzLk5ld1NlcnZpY2VNb2RlbFdpZGdldF8zIDogY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJaXRlbS5zZXRJbWFnZShjb25maWdJY29uKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlU2VydmljZShUcmVlSXRlbSBwYXJlbnQsIElTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJYm9vbGVhbiBkaXNhYmxlZCA9IGNvbmZpZ3VyYXRpb24uaXNEaXNhYmxlZChzZXJ2aWNlKTsKLQkJVHJlZUl0ZW0gY2hpbGQgPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNoaWxkLnNldFRleHQoc2VydmljZS5nZXROYW1lKCkpOwotCQljaGlsZC5zZXREYXRhKFNFUlZJQ0VfS0VZLCBzZXJ2aWNlKTsKLQkJY2hpbGQuc2V0RGF0YShESVNBQkxFRF9LRVksIGRpc2FibGVkKTsKLQkJY2hpbGQuc2V0SW1hZ2UoZGlzYWJsZWQgPyBkaXNhYmxlZEljb24gOiBlbmFibGVkSWNvbik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGFwcGx5Q2hhbmdlc1RvQ29uZmlndXJhdGlvbigpIHsKLQkJaWYoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJZm9yKFRyZWVJdGVtIGNhdGVnb3J5VHJlZUl0ZW0gOiBzZXJ2aWNlc1RyZWUuZ2V0SXRlbXMoKSkgewotCQkJZm9yKFRyZWVJdGVtIHNlcnZpY2VUcmVlSXRlbSA6IGNhdGVnb3J5VHJlZUl0ZW0uZ2V0SXRlbXMoKSkgewotCQkJCUlTZXJ2aWNlIHNlcnZpY2UgPSAoSVNlcnZpY2UpIHNlcnZpY2VUcmVlSXRlbS5nZXREYXRhKFNFUlZJQ0VfS0VZKTsKLQkJCQlib29sZWFuIGRpc2FibGVkID0gQm9vbGVhbi5UUlVFLmVxdWFscyhzZXJ2aWNlVHJlZUl0ZW0uZ2V0RGF0YShESVNBQkxFRF9LRVkpKTsKLQkJCQkKLQkJCQlpZihkaXNhYmxlZCkgewotCQkJCQljb25maWd1cmF0aW9uLmRpc2FibGUoc2VydmljZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBUT0RPIGNoZWNrIGlmIHRoZSBzdGF0ZSBvZiB0aGUgbmV3IHNlcnZpY2UgcHJvdmlkZXIgaXMgYWN0dWFsbHkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lCi0JCQkJCS8vIG5vIG5lZWQgdG8gZmlyZSBib2d1cyBjaGFuZ2UgZXZlbnRzCi0JCQkJCUlTZXJ2aWNlUHJvdmlkZXIgc2VydmljZVByb3ZpZGVyID0gKElTZXJ2aWNlUHJvdmlkZXIpIHNlcnZpY2VUcmVlSXRlbS5nZXREYXRhKFBST1ZJREVSX0tFWSk7Ci0JCQkJCWlmKHNlcnZpY2VQcm92aWRlciAhPSBudWxsKQotCQkJCQkJY29uZmlndXJhdGlvbi5zZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSwgc2VydmljZVByb3ZpZGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvcjxJU2VydmljZUNhdGVnb3J5PiBDQVRFR09SWV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8SVNlcnZpY2VDYXRlZ29yeT4oKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShJU2VydmljZUNhdGVnb3J5IHgsIElTZXJ2aWNlQ2F0ZWdvcnkgeSkgewotCQkJcmV0dXJuIHguZ2V0TmFtZSgpLmNvbXBhcmVUbyh5LmdldE5hbWUoKSk7Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3I8SVNlcnZpY2U+IFNFUlZJQ0VfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPElTZXJ2aWNlPigpIHsKLQkJcHVibGljIGludCBjb21wYXJlKElTZXJ2aWNlIHgsIElTZXJ2aWNlIHkpIHsKLQkJCXJldHVybiBjb21wYXJlUHJpb3JpdGllcyh4LmdldFByaW9yaXR5KCksIHkuZ2V0UHJpb3JpdHkoKSwgeC5nZXROYW1lKCksIHkuZ2V0TmFtZSgpKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvcjxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4gUFJPVklERVJfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPigpIHsKLQkJcHVibGljIGludCBjb21wYXJlKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIHgsIElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIHkpIHsKLQkJCXJldHVybiBjb21wYXJlUHJpb3JpdGllcyh4LmdldFByaW9yaXR5KCksIHkuZ2V0UHJpb3JpdHkoKSwgeC5nZXROYW1lKCksIHkuZ2V0TmFtZSgpKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVQcmlvcml0aWVzKEludGVnZXIgcDEsIEludGVnZXIgcDIsIFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCS8vIHNvcnQgYnkgcHJpb3JpdHkgYnV0IGZhbGwgYmFjayBvbiBzb3J0aW5nIGFscGhhYmV0aWNhbGx5Ci0JCWlmKHAxID09IG51bGwgJiYgcDIgPT0gbnVsbCkKLQkJCXJldHVybiBuYW1lMS5jb21wYXJlVG8obmFtZTIpOwotCQlpZihwMSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZihwMiA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChwMS5lcXVhbHMocDIpKSB7Ci0JCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvKG5hbWUyKTsKLQkJfQotCQlyZXR1cm4gcDEuY29tcGFyZVRvKHAyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpZGdldHMvTmV3U2VydmljZU1vZGVsV2lkZ2V0RGlhbG9nLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpZGdldHMvTmV3U2VydmljZU1vZGVsV2lkZ2V0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MzNmZDUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aWRnZXRzL05ld1NlcnZpY2VNb2RlbFdpZGdldERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTWlrZSBLdWNlcmEgKElCTSBDb3Jwb3JhdGlvbikgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpZGdldHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5JU2hlbGxQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIExhdW5jaGVzIGEgZGlhbG9nIHRoYXQgY29udGFpbnMgdGhlIE5ld1NlcnZpY2VNb2RlbFdpZGdldAotICogd2l0aCBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2aWNlTW9kZWxXaWRnZXREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBOZXdTZXJ2aWNlTW9kZWxXaWRnZXQgc2VydmljZU1vZGVsV2lkZ2V0OwotCXByaXZhdGUgSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkKLQlwdWJsaWMgTmV3U2VydmljZU1vZGVsV2lkZ2V0RGlhbG9nKElTaGVsbFByb3ZpZGVyIHBhcmVudFNoZWxsLCBJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JcHVibGljIE5ld1NlcnZpY2VNb2RlbFdpZGdldERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuTmV3U2VydmljZU1vZGVsV2lkZ2V0RGlhbG9nX3RpdGxlKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkKLQkJc2VydmljZU1vZGVsV2lkZ2V0ID0gbmV3IE5ld1NlcnZpY2VNb2RlbFdpZGdldChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gCQlzZXJ2aWNlTW9kZWxXaWRnZXQuc2V0U2VydmljZUNvbmZpZ3VyYXRpb24oY29uZmlnKTsKLSAJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAJCWRhdGEubWluaW11bUhlaWdodCA9IDQwMDsKLSAJCXNlcnZpY2VNb2RlbFdpZGdldC5zZXRMYXlvdXREYXRhKGRhdGEpOwotIAkJcmV0dXJuIHNlcnZpY2VNb2RlbFdpZGdldDsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc2VydmljZU1vZGVsV2lkZ2V0LmFwcGx5Q2hhbmdlc1RvQ29uZmlndXJhdGlvbigpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2lkZ2V0cy9TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aWRnZXRzL1NlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzNlZjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aWRnZXRzL1NlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogU3RhbmRhcmQgd2lkZ2V0IGZvciBzZWxlY3RpbmcgYSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIERpc3BsYXlzIGEgdHJlZSB2aWV3IG9mIHNlcnZpY2UgY29uZmlndXJhdGlvbnMgc28gdGhhdCB0aGUgdXNlciBjYW4gZWFzaWx5Ci0gKiBzZWUgd2hhdCBzZXJ2aWNlcyBhbmQgcHJvdmlkZXJzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyIHsKLQkvKioKLQkgKiBDb21wYXJhdG9yIGNsYXNzIHVzZWQgdG8gc29ydCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zIGluIGFzY2VuZGluZyBvcmRlcgotCSAqIGJ5IG5hbWUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNlcnZpY2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciBleHRlbmRzIFZpZXdlckNvbXBhcmF0b3IgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIElTZXJ2aWNlQ29uZmlndXJhdGlvbiAmJiBvMiBpbnN0YW5jZW9mIElTZXJ2aWNlQ29uZmlndXJhdGlvbikgewotCQkJCXJldHVybiAoKElTZXJ2aWNlQ29uZmlndXJhdGlvbilvMSkuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoKChJU2VydmljZUNvbmZpZ3VyYXRpb24pbzIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgbzEsIG8yKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFNlcnZpY2VDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIgewotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5CYXNlV29ya2JlbmNoQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2aWNlQ29uZmlndXJhdGlvbikgewotCQkJCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSAoSVNlcnZpY2VDb25maWd1cmF0aW9uKWVsZW1lbnQ7Ci0JCQkJU2V0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQkJZm9yIChJU2VydmljZSBzZXJ2aWNlIDogY29uZmlnLmdldFNlcnZpY2VzKCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNvbmZpZy5nZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSkpOwotCQkJCX0KLQkJCQlmb3IgKElTZXJ2aWNlIHNlcnZpY2UgOiBmTWFuYWdlci5nZXRTZXJ2aWNlcygpKSB7Ci0JCQkJCWlmIChjb25maWcuaXNEaXNhYmxlZChzZXJ2aWNlKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKHNlcnZpY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2aWNlTW9kZWxNYW5hZ2VyICYmIGZFeGNsdWRlZENvbmZpZ3MgIT0gbnVsbCkgewotCQkJCVNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGNoaWxkcmVuID0gKChJU2VydmljZU1vZGVsTWFuYWdlcillbGVtZW50KS5nZXRDb25maWd1cmF0aW9ucygpOwotCQkJCWNoaWxkcmVuLnJlbW92ZUFsbChmRXhjbHVkZWRDb25maWdzKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgVHJlZVZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGZBZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZlJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmUmVuYW1lQnV0dG9uOwotCQotCXByaXZhdGUgSVNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBmRW5hYmxlZCA9IHRydWU7Ci0JcHJpdmF0ZSBTZXQ8SVNlcnZpY2VDb25maWd1cmF0aW9uPiBmRXhjbHVkZWRDb25maWdzOwotCXByaXZhdGUgYm9vbGVhbiBmQnV0dG9uc1Zpc2libGUgPSB0cnVlOwotCQotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IGZTZWxlY3Rpb25MaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBJU2VydmljZU1vZGVsTWFuYWdlciBmTWFuYWdlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkKLQlwcml2YXRlIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBmU2VsZWN0ZWRDb25maWcgPSBudWxsOwotCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0aGlzIChwYXJlbnQsIHN0eWxlLCBudWxsLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgCi0JCQlTZXQ8SVNlcnZpY2VDb25maWd1cmF0aW9uPiBleGNsdWRlZCwgYm9vbGVhbiBidXR0b25zKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlDb21wb3NpdGUgbGFiZWxDb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCWxhYmVsQ29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxDb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMCk7Ci0KLQkJQ29tcG9zaXRlIHRyZWVDb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCXRyZWVDb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQl0cmVlQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQkJCi0JCWZWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlQ29tcCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWZWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZXJ2aWNlQ29udGVudFByb3ZpZGVyKCkpOwotCQlmVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0JCWZWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgU2VydmljZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yKCkpOwotCQlmVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQkJZlZpZXdlci5nZXRUcmVlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlmVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCUlUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSAoSVRyZWVTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJCQlUcmVlUGF0aCBwYXRoID0gdHJlZVNlbGVjdGlvbi5nZXRQYXRocygpWzBdOwotCQkJCQlmU2VsZWN0ZWRDb25maWcgPSAoSVNlcnZpY2VDb25maWd1cmF0aW9uKXBhdGguZ2V0Rmlyc3RTZWdtZW50KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZlNlbGVjdGVkQ29uZmlnID0gbnVsbDsKLQkJCQl9Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQlub3RpZnlTZWxlY3Rpb24oZlZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCWZWaWV3ZXIuc2V0SW5wdXQoU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpKTsKLQkJCi0JCWlmIChidXR0b25zKSB7Ci0JCQlDb21wb3NpdGUgYnV0dG9uc0NvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJCWJ1dHRvbnNDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuVE9QLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQkJCWJ1dHRvbnNDb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJCWZBZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wLCBTV1QuUFVTSCk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpOwotCQkJZGF0YS53aWR0aEhpbnQgPSAxMTA7Ci0JCQlmQWRkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlmQWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMSk7Ci0JCQlmQWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQkJCQlJbnB1dERpYWxvZyBkaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coZkFkZEJ1dHRvbi5nZXRTaGVsbCgpLCBNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldF8yLCAKLQkJCQkJCQlNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldF8zLCBudWxsLCBudWxsKTsKLQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gSW5wdXREaWFsb2cuT0spIHsKLQkJCQkJCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSBmTWFuYWdlci5uZXdTZXJ2aWNlQ29uZmlndXJhdGlvbihkaWFsb2cuZ2V0VmFsdWUoKSk7Ci0JCQkJCQlmTWFuYWdlci5hZGRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCQlmVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlmUmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcCwgU1dULlBVU0gpOwotCQkJZlJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JCQlmUmVtb3ZlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfNCk7Ci0JCQlmUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJCQkJSVRyZWVTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUcmVlU2VsZWN0aW9uKWZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJT2JqZWN0W10gY29uZmlncyA9IChPYmplY3RbXSlzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJCQkJU3RyaW5nIG5hbWVzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChpID4gMCkgewotCQkJCQkJCQluYW1lcyArPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCW5hbWVzICs9ICJcIiIgKyAoKElTZXJ2aWNlQ29uZmlndXJhdGlvbiljb25maWdzW2ldKS5nZXROYW1lKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gZG9SZW1vdmUgPSBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKGZSZW1vdmVCdXR0b24uZ2V0U2hlbGwoKSwgTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfOSwKLQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMTAsIG5hbWVzKSk7Ci0JCQkJCQlpZiAoZG9SZW1vdmUpIHsKLQkJCQkJCQlmb3IgKE9iamVjdCBjb25maWcgOiBjb25maWdzKSB7Ci0JCQkJCQkJCWZNYW5hZ2VyLnJlbW92ZSgoSVNlcnZpY2VDb25maWd1cmF0aW9uKWNvbmZpZyk7Ci0JCQkJCQkJfQotCQkJCQkJCWZWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWZSZW5hbWVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wLCBTV1QuUFVTSCk7Ci0JCQlmUmVuYW1lQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQkJCWZSZW5hbWVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldF8xMSk7Ci0JCQlmUmVuYW1lQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlJlbmFtZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJCQkJSVRyZWVTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUcmVlU2VsZWN0aW9uKWZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJSW5wdXREaWFsb2cgZGlhbG9nID0gbmV3IElucHV0RGlhbG9nKGZBZGRCdXR0b24uZ2V0U2hlbGwoKSwgTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaWRnZXRfMTIsIAotCQkJCQkJCQlNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvblNlbGVjdGlvbldpZGdldF8xMywgbnVsbCwgbnVsbCk7Ci0JCQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBJbnB1dERpYWxvZy5PSykgewotCQkJCQkJCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSAoSVNlcnZpY2VDb25maWd1cmF0aW9uKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCQljb25maWcuc2V0TmFtZShkaWFsb2cuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJZlZpZXdlci51cGRhdGUoY29uZmlnLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlmRXhjbHVkZWRDb25maWdzID0gZXhjbHVkZWQ7Ci0JCWZCdXR0b25zVmlzaWJsZSA9IGJ1dHRvbnM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJZlZpZXdlci5nZXRUcmVlKCkuc2V0RW5hYmxlZChmRW5hYmxlZCk7Ci0JCWlmIChmQnV0dG9uc1Zpc2libGUpIHsKLQkJCWZBZGRCdXR0b24uc2V0RW5hYmxlZChmRW5hYmxlZCk7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSBmRW5hYmxlZCAmJiBnZXRTZWxlY3RlZENvbmZpZ3VyYXRpb24oKSAhPSBudWxsOwotCQkJZlJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJZlJlbmFtZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wjZ2V0RW5hYmxlZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZFbmFibGVkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wjc2V0RW5hYmxlZChib29sZWFuKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWZFbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSB1c2VycyBzZWxlY3RzIGEgc2VydmljZSBjb25maWd1cmF0aW9uCi0JICogPC9wPgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU2VsZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFNlbGVjdGVkIHNlcnZpY2UgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU2VydmljZUNvbmZpZ3VyYXRpb24gZ2V0U2VsZWN0ZWRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGVkQ29uZmlnOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gYSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHdpbGwgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlNlbGVjdGlvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZnkgYWxsIGxpc3RlbmVycyBvZiB0aGUgc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlIGV2ZW50IHRoYXQgd2FzIGdlbmVyYXRlZCBieSB0aGUgc2VsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBnZXRTZWxlY3Rpb24oKSk7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogZlNlbGVjdGlvbkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcikuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpZGdldHMvU2VydmljZU1vZGVsV2lkZ2V0LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpZGdldHMvU2VydmljZU1vZGVsV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2Q2YzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aWRnZXRzL1NlcnZpY2VNb2RlbFdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuVGFibGVDb2x1bW5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5TZXJ2aWNlTW9kZWxVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLmRpYWxvZ3MuU2VydmljZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgb3IKLSAqIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZwotICogd2l0aCB0aGUgUkRUIHRlYW0uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VNb2RlbFdpZGdldCB7Ci0JCi0JcHVibGljIGNsYXNzIEFkZExpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJU2V0PElTZXJ2aWNlPiBkaXNwbGF5U2V0ID0gbmV3IEhhc2hTZXQ8SVNlcnZpY2U+KCk7Ci0JCQlTZXQ8SVNlcnZpY2U+IGNvbmZpZ1NlcnZpY2VzID0gZ2V0U2VydmljZUNvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpOwotCQkJLyoKLQkJCSAqIENhbGN1bGF0ZSB0aGUgc2V0IG9mIHNlcnZpY2VzIHRvIGRpc3BsYXkuIE9ubHkgaW5jbHVkZSBzZXJ2aWNlcyB0aGF0IAotCQkJICogYXJlIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgdGhhdCBoYXZlIG9uZSBvciBtb3JlIHByb3ZpZGVycy4KLQkJCSAqLwotCQkJZm9yIChJU2VydmljZSBzZXJ2aWNlIDogU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2VzKCkpIHsKLQkJCQlpZiAoIWNvbmZpZ1NlcnZpY2VzLmNvbnRhaW5zKHNlcnZpY2UpICYmIHNlcnZpY2UuZ2V0UHJvdmlkZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJCQlkaXNwbGF5U2V0LmFkZChzZXJ2aWNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVNlcnZpY2VzRGlhbG9nIGRpYWxvZyA9IG5ldyBTZXJ2aWNlc0RpYWxvZyhnZXRTaGVsbCgpLCBkaXNwbGF5U2V0LnRvQXJyYXkobmV3IElTZXJ2aWNlWzBdKSk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCQlJU2VydmljZVtdIHNlbGVjdGVkU2VydmljZXMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRTZXJ2aWNlcygpOwotCQkJCWZvciAoSVNlcnZpY2Ugc2VydmljZSA6IHNlbGVjdGVkU2VydmljZXMpIHsKLQkJCQkJU29ydGVkU2V0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPiBwcm92aWRlcnMgPSBzZXJ2aWNlLmdldFByb3ZpZGVyc0J5UHJpb3JpdHkoKTsKLQkJCQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXJzLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQkJYWRkVGFibGVSb3coc2VydmljZSwgcHJvdmlkZXIpOwotCQkJCQlnZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpLnNldFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlLCBwcm92aWRlcik7Ci0JCQkJfQotCQkJCXVwZGF0ZUFkZFJlbW92ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgQ29uZmlndXJlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBsYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24gVUkgZm9yIHRoZSBzZXJ2aWNlIHByb3ZpZGVyCi0JCQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSBmVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJVGFibGVJdGVtIGl0ZW0gPSBzZWxlY3Rpb25bMF07Ci0JCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gKElTZXJ2aWNlUHJvdmlkZXIpIGl0ZW0uZ2V0RGF0YShQUk9WSURFUl9LRVkpOwotCi0JCQlJU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IgY29uZmlnID0gU2VydmljZU1vZGVsVUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IocHJvdmlkZXIpOwotCQkJSVdpemFyZCB3aXphcmQgPSBjb25maWcuZ2V0V2l6YXJkKHByb3ZpZGVyLCBudWxsKTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJCi0JCQlTdHJpbmcgY29uZmlnU3RyaW5nID0gcHJvdmlkZXIuZ2V0Q29uZmlndXJhdGlvblN0cmluZygpOwotCQkJLy8gY29sdW1uIDIgaG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIG9mIHRoZSBwcm92aWRlcidzIGN1cnJlbnQgY29uZmlndXJhdGlvbiAKLQkJCWlmIChjb25maWdTdHJpbmcgPT0gbnVsbCkgewotCQkJCWNvbmZpZ1N0cmluZyA9IE1lc3NhZ2VzLlNlcnZpY2VNb2RlbFdpZGdldF80OwotCQkJfQotCQkJaXRlbS5zZXRUZXh0KDIsIGNvbmZpZ1N0cmluZyk7Ci0JCQkKLQkJCS8vIGFsbG93IGNvbnRhaW5lciBwYWdlIHRvIGNoZWNrIGlmIGNvbmZpZ3VyYXRpb25zIGFyZSBzZXQKLQkJCWlmIChmQ29uZmlnQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWZDb25maWdDaGFuZ2VMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgUmVtb3ZlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGZUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZvciAoVGFibGVJdGVtIGl0ZW0gOiBpdGVtcykgewotCQkJCUlTZXJ2aWNlIHNlcnZpY2UgPSAoSVNlcnZpY2UpIGl0ZW0uZ2V0RGF0YShTRVJWSUNFX0tFWSk7Ci0JCQkJaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotCQkJCQlnZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpLmRpc2FibGUoc2VydmljZSk7Ci0JCQkJfQotCQkJCWZUYWJsZS5yZW1vdmUoZlRhYmxlLmluZGV4T2YoaXRlbSkpOwotCQkJfQotCQkJdXBkYXRlQWRkUmVtb3ZlQnV0dG9ucygpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX0tFWSA9ICJwcm92aWRlci1pZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0tFWSA9ICJzZXJ2aWNlLWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBmU2VydmljZUNvbmZpZ3VyYXRpb247Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZlNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEOwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJU2VydmljZVByb3ZpZGVyPiBmUHJvdmlkZXJJRFRvUHJvdmlkZXJNYXA7Ci0JcHJvdGVjdGVkIFRhYmxlIGZUYWJsZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDb25maWd1cmVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQWRkQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZlJlbW92ZUJ1dHRvbjsKLQkKLQlwcm90ZWN0ZWQgTGlzdGVuZXIgZkNvbmZpZ0NoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQkKLQlwcml2YXRlIFNoZWxsIGZTaGVsbDsKLQkKLQlwdWJsaWMgU2VydmljZU1vZGVsV2lkZ2V0KCkgewotCQlmU2VydmljZUlEVG9TZWxlY3RlZFByb3ZpZGVySUQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZlByb3ZpZGVySURUb1Byb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJU2VydmljZVByb3ZpZGVyPigpOwotCX0KLQkKLQlwdWJsaWMgU2VydmljZU1vZGVsV2lkZ2V0KElTZXJ2aWNlQ29uZmlndXJhdGlvbiBzZXJ2aWNlQ29uZmlndXJhdGlvbikgewotCQlmU2VydmljZUNvbmZpZ3VyYXRpb24gPSBzZXJ2aWNlQ29uZmlndXJhdGlvbjsKLQkJZlNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWZQcm92aWRlcklEVG9Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVNlcnZpY2VQcm92aWRlcj4oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRhYmxlUm93KElTZXJ2aWNlIHNlcnZpY2UsIElTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtIChmVGFibGUsIFNXVC5OT05FKTsKLQotCQkvLyBjb2x1bW4gMCBsaXN0cyB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQotCQlpdGVtLnNldFRleHQgKDAsIHNlcnZpY2UuZ2V0TmFtZSgpKTsKLQkJaXRlbS5zZXREYXRhKFNFUlZJQ0VfS0VZLCBzZXJ2aWNlKTsKLQkJCi0JCS8vIGNvbHVtbiAxIGhvbGRzIGEgZHJvcGRvd24gd2l0aCBhIGxpc3Qgb2YgcHJvdmlkZXJzCi0JCS8vIGRlZmF1bHQgZW50cnkgaXMgdGhlIGZpcnN0IHByb3ZpZGVyIGlmIHRoZXJlIGlzIG9uZQkJCi0JCWl0ZW0uc2V0VGV4dCgxLCBwcm92aWRlci5nZXROYW1lKCkpOwotCQlpdGVtLnNldERhdGEoUFJPVklERVJfS0VZLCBwcm92aWRlcik7Ci0JCQotCQkvLyBjb2x1bW4gMiBob2xkcyB0aGUgc3RhdHVzIHN0cmluZwotCQlpdGVtLnNldFRleHQoMiwgcHJvdmlkZXIuZ2V0Q29uZmlndXJhdGlvblN0cmluZygpKTsKLQkJCi0JCWZTZXJ2aWNlSURUb1NlbGVjdGVkUHJvdmlkZXJJRC5wdXQoc2VydmljZS5nZXRJZCgpLCBwcm92aWRlci5nZXRJZCgpKTsKLQotCQkvLyBhbGxvdyBjb250YWluZXIgcGFnZSB0byBjaGVjayBpZiBjb25maWd1cmF0aW9ucyBhcmUgc2V0Ci0JCWlmIChmQ29uZmlnQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZkNvbmZpZ0NoYW5nZUxpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZlNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0JCQotCQlDb21wb3NpdGUgY2FudmFzID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBjYW52YXNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNhbnZhcy5zZXRMYXlvdXQoY2FudmFzTGF5b3V0KTsKLQkJCi0JCUNvbXBvc2l0ZSB0YWJsZVBhcmVudCA9IG5ldyBDb21wb3NpdGUoY2FudmFzLCBTV1QuTk9ORSk7Ci0JCXRhYmxlUGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkKLQkJZlRhYmxlID0gbmV3IFRhYmxlKHRhYmxlUGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMKTsKLQkJZlRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JCWZUYWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQkJCi0JCVRhYmxlQ29sdW1uTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUNvbHVtbkxheW91dCgpOwotCQkvLyBjcmVhdGUgdGhlIGNvbHVtbnMgYW5kIGhlYWRlcnMuLi4gbm90ZSBmb3VydGggY29sdW1uIGhvbGRzICJDb25maWd1cmUuLi4iIGJ1dHRvbnMgYW5kIGhlbmNlIGhhcyBubyB0aXRsZS4KLQkJU3RyaW5nW10gdGl0bGVzID0ge01lc3NhZ2VzLlNlcnZpY2VNb2RlbFdpZGdldF8wLCBNZXNzYWdlcy5TZXJ2aWNlTW9kZWxXaWRnZXRfMSwgTWVzc2FnZXMuU2VydmljZU1vZGVsV2lkZ2V0XzN9OwotCQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKGZUYWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQgKHRpdGxlcyBbaV0pOwotCQkJaW50IHdpZHRoID0gQ29sdW1uV2VpZ2h0RGF0YS5NSU5JTVVNX1dJRFRIOwotCQkJCi0JCQkvLyBzZXQgdGhlIGNvbHVtbiB3aWR0aHMKLQkJCXN3aXRjaCAoaSkgewotCQkJY2FzZSAwOiAvLyBTZXJ2aWNlIG5hbWUuLi4gdXN1YWxseSBzaG9ydAotCQkJCXdpZHRoID0gMTAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDE6IC8vIHByb3ZpZGVyIG5hbWUuLi4gdHlwaWNhbGx5IGxvbmcKLQkJCQl3aWR0aCA9IDI1MDsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgMjogLy8gY29uZmlndXJhdGlvbiBzdGF0dXMuLi4gdHlwaWNhbGx5IHNob3J0Ci0JCQkJd2lkdGggPSAxMDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCX0KLQkJCQotCQkJbGF5b3V0LnNldENvbHVtbkRhdGEoY29sdW1uLCBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxLCB3aWR0aCwgdHJ1ZSkpOwotCQkJCi0KLQkJfQotCQl0YWJsZVBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZlRhYmxlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCWNyZWF0ZVRhYmxlQ29udGVudCgpOwotCQkKLQkJZlRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQotCQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IoZlRhYmxlKTsKLQkJZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQlmVGFibGUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBmVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoc2VsZWN0aW9uSW5kZXggPT0gLTEpIHsKLQkJCQkJZkNvbmZpZ3VyZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlmaW5hbCBUYWJsZUl0ZW0gaXRlbSA9IGZUYWJsZS5nZXRJdGVtKHNlbGVjdGlvbkluZGV4KTsKLQkJCQlJU2VydmljZSBzZXJ2aWNlID0gKElTZXJ2aWNlKSBpdGVtLmdldERhdGEoU0VSVklDRV9LRVkpOwotCQkJCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIgPSAoSVNlcnZpY2VQcm92aWRlcikgaXRlbS5nZXREYXRhKFBST1ZJREVSX0tFWSk7Ci0JCQkJCi0JCQkJdXBkYXRlQ29uZmlndXJlQnV0dG9uKHByb3ZpZGVyKTsKLQkJCQkKLQkJCQlmaW5hbCBDQ29tYm8gY29tYm8gPSBuZXcgQ0NvbWJvKGZUYWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJCi0JCQkJLy8gcG9wdWxhdGUgd2l0aCBsaXN0IG9mIHByb3ZpZGVycwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZmluYWwgTGlzdDxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4gcHJvdmlkZXJJZHMgPSBuZXcgTGlua2VkTGlzdDxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4oKTsKLQkJCQlTb3J0ZWRTZXQ8SVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I+IHByb3ZpZGVycyA9IHNlcnZpY2UuZ2V0UHJvdmlkZXJzQnlQcmlvcml0eSgpOwotCQkJCWZvciAoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHByb3ZpZGVycykgewotCQkJCQljb21iby5hZGQoZGVzY3JpcHRvci5nZXROYW1lKCksIGluZGV4KTsKLQkJCQkJcHJvdmlkZXJJZHMuYWRkKGRlc2NyaXB0b3IpOwotCQkJCQlpZiAoZGVzY3JpcHRvci5nZXRJZCgpLmVxdWFscyhwcm92aWRlci5nZXRJZCgpKSkgewotCQkJCQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQkJCQkJfQotCQkJCQkrK2luZGV4OwotCQkJCX0KLQkJCQkKLQkJCQljb21iby5zZXRGb2N1cygpOwotCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCQljYXNlIFNXVC5Gb2N1c091dDoKLQkJCQkJCQljb21iby5kaXNwb3NlKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNXVC5TZWxlY3Rpb246Ci0JCQkJCQkJaW50IHNlbGVjdGlvbiA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbiA9PSAtMSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCUlTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBwcm92aWRlcklkcy5nZXQoc2VsZWN0aW9uKTsKLQkJCQkJCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0U2VydmljZVByb3ZpZGVyKGRlc2NyaXB0b3IpOwotCQkJCQkJCQotCQkJCQkJCS8qCi0JCQkJCQkJICogU2V0IHRoZSBwcm92aWRlciBuYW1lIGluIHRoZSBzZWNvbmQgZmllbGQgb2YgdGhlIHJvdwotCQkJCQkJCSAqLwotCQkJCQkJCWl0ZW0uc2V0VGV4dCgxLCBwcm92aWRlci5nZXROYW1lKCkpOwotCQkJCQkJCWl0ZW0uc2V0RGF0YShQUk9WSURFUl9LRVksIHByb3ZpZGVyKTsKLQotCQkJCQkJCXVwZGF0ZUNvbmZpZ3VyZUJ1dHRvbihkZXNjcmlwdG9yKTsJCQkJCQkJCi0JCQkJCQkJCi0JCQkJCQkJLyoKLQkJCQkJCQkgKiBTZXQgdGhlIGNvbmZpZ3VyZWQgc3RhdHVzIGluIHRoZSB0aGlyZCBmaWVsZAotCQkJCQkJCSAqLwotCQkJCQkJCWl0ZW0uc2V0VGV4dCgyLCBwcm92aWRlci5nZXRDb25maWd1cmF0aW9uU3RyaW5nKCkpOwotCi0JCQkJCQkJLyoKLQkJCQkJCQkgKiBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJCQkJCQkgKi8KLQkJCQkJCQlJU2VydmljZSBzZXJ2aWNlID0gKElTZXJ2aWNlKSBpdGVtLmdldERhdGEoU0VSVklDRV9LRVkpOwotCQkJCQkJCWZTZXJ2aWNlSURUb1NlbGVjdGVkUHJvdmlkZXJJRC5wdXQoc2VydmljZS5nZXRJZCgpLCBkZXNjcmlwdG9yLmdldElkKCkpOwotCQkJCQkJCWdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkuc2V0U2VydmljZVByb3ZpZGVyKHNlcnZpY2UsIHByb3ZpZGVyKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBhbGxvdyBjb250YWluZXIgcGFnZSB0byBjaGVjayBpZiBjb25maWd1cmF0aW9ucyBhcmUgc2V0Ci0JCQkJCQkJaWYgKGZDb25maWdDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCWZDb25maWdDaGFuZ2VMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJY29tYm8uZGlzcG9zZSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQljb21iby5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIGxpc3RlbmVyKTsKLQkJCQljb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0KLQkJCQllZGl0b3Iuc2V0RWRpdG9yKGNvbWJvLCBpdGVtLCAxKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uUGFyZW50ID0gbmV3IENvbXBvc2l0ZShjYW52YXMsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBidXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJYnV0dG9uUGFyZW50LnNldExheW91dChidXR0b25MYXlvdXQpOwotCQlidXR0b25QYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJZkNvbmZpZ3VyZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFyZW50LCBTV1QuUFVTSCk7Ci0JCWZDb25maWd1cmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZDb25maWd1cmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlTW9kZWxXaWRnZXRfMik7Ci0JCWZDb25maWd1cmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUxpc3RlbmVyIGNvbmZpZ3VyZUxpc3RlbmVyID0gZ2V0Q29uZmlndXJlTGlzdGVuZXIoKTsKLQkJZkNvbmZpZ3VyZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBjb25maWd1cmVMaXN0ZW5lcik7Ci0JCQotCQlmQWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYXJlbnQsIFNXVC5QVVNIKTsKLQkJZkFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlmQWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuU2VydmljZU1vZGVsV2lkZ2V0XzYpOwotCQlmQWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlMaXN0ZW5lciBhZGRMaXN0ZW5lciA9IGdldEFkZExpc3RlbmVyKCk7Ci0JCWZBZGRCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWRkTGlzdGVuZXIpOwotCQkKLQkJZlJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFyZW50LCBTV1QuUFVTSCk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlTW9kZWxXaWRnZXRfNyk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUxpc3RlbmVyIHJlbW92ZUxpc3RlbmVyID0gZ2V0UmVtb3ZlTGlzdGVuZXIoKTsKLQkJZlJlbW92ZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCByZW1vdmVMaXN0ZW5lcik7Ci0KLQkJdXBkYXRlQWRkUmVtb3ZlQnV0dG9ucygpOwotCQkKLQkJcmV0dXJuIGNhbnZhczsKLQl9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGUgdGhlIHNlcnZpY2VzLCBwcm92aWRlcnMgYW5kIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlIGZvcgotCSAqIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGluIHRoZSB0YWJsZQotCSAqIAotCSAqIFN1Yi1jbGFzc2VzIG1heSBvdmVycmlkZSBpdHMgYmVoYXZpb3VyCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZUNvbnRlbnQoKSB7Ci0JCWZUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCi0JCWlmIChnZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLQkJCWZvciAoSVNlcnZpY2Ugc2VydmljZSA6IGdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZXMoKSkgewotCQkJCWFkZFRhYmxlUm93KHNlcnZpY2UsIGdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZVByb3ZpZGVyKHNlcnZpY2UpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvL3N1YiBjbGFzcyBtYXkgb3ZlcnJpZGUgdG8gY2hhbmdlIGJlaGF2aW91cgotCXByb3RlY3RlZCBMaXN0ZW5lciBnZXRBZGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRMaXN0ZW5lcigpOwkJCi0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIExpc3RlbmVyIGdldENvbmZpZ0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gZkNvbmZpZ0NoYW5nZUxpc3RlbmVyOwotCX0KLQkKLQkvL3N1YiBjbGFzcyBtYXkgb3ZlcnJpZGUgdG8gY2hhbmdlIGJlaGF2aW91cgotCXByb3RlY3RlZCBMaXN0ZW5lciBnZXRDb25maWd1cmVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmVMaXN0ZW5lcigpOwkJCi0JfQotCQotCS8qKgotCSAqIEZpbmQgYXZhaWxhYmxlIHJlbW90ZSBzZXJ2aWNlcyBhbmQgc2VydmljZSBwcm92aWRlcnMgZm9yIGEgZ2l2ZW4gcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBTZXQ8SVNlcnZpY2U+IGdldENvbnRyaWJ1dGVkU2VydmljZXMoSVByb2plY3QgcHJvamVjdCkgewkJCi0JCUlTZXJ2aWNlTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU2V0PElTZXJ2aWNlPiBhbGxBcHBsaWNhYmxlU2VydmljZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJU2VydmljZT4oKTsKLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCi0JCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBuZXcgU3RyaW5nW10ge307CQkJCi0JCQl0cnkgewotCQkJCS8vZ2V0IHRoZSBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIHByb2plY3QKLQkJCQluYXR1cmVJZHMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7CQkJCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQkJCi0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYXR1cmVJZCA9IG5hdHVyZUlkc1tpXTsKLQkJCQlTZXQ8SVNlcnZpY2U+IHNlcnZpY2VzID0gbW9kZWxNYW5hZ2VyLmdldFNlcnZpY2VzKG5hdHVyZUlkKTsKLQkJCQlpZiAoc2VydmljZXMgIT0gbnVsbCkKLQkJCQkJYWxsQXBwbGljYWJsZVNlcnZpY2VzLmFkZEFsbChzZXJ2aWNlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbEFwcGxpY2FibGVTZXJ2aWNlczsKLQl9Ci0JCi0JcHVibGljIE1hcDxTdHJpbmcsIElTZXJ2aWNlUHJvdmlkZXI+IGdldFByb3ZpZGVySURUb1Byb3ZpZGVyTWFwKCkgewotCQlyZXR1cm4gZlByb3ZpZGVySURUb1Byb3ZpZGVyTWFwOwotCX0KLQkKLQkvL3N1YiBjbGFzcyBtYXkgb3ZlcnJpZGUgdG8gY2hhbmdlIGJlaGF2aW91cgotCXByb3RlY3RlZCBMaXN0ZW5lciBnZXRSZW1vdmVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdmVMaXN0ZW5lcigpOwkJCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd2lkZ2V0Ci0JICogCi0JICogQHJldHVybiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VDb25maWd1cmF0aW9uIGdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gZlNlcnZpY2VDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gZlNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHRoZSBzZXJ2aWNlIHByb3ZpZGVyIGZvciB0aGUgZGVzY3JpcHRvci4gS2VlcHMgYSBjYWNoZSBvZiBzZXJ2aWNlIHByb3ZpZGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciBkZXNjcmlwdG9yIGZvciB0aGUgc2VydmljZSBwcm92aWRlcgotCSAqIEByZXR1cm4gc2VydmljZSBwcm92aWRlcgotCSAqLwotCXByaXZhdGUgSVNlcnZpY2VQcm92aWRlciBnZXRTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJU2VydmljZVByb3ZpZGVyIHNlcnZpY2VQcm92aWRlciA9IGdldFByb3ZpZGVySURUb1Byb3ZpZGVyTWFwKCkuZ2V0KGRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCQotCQlpZiAoc2VydmljZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VQcm92aWRlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlUHJvdmlkZXIoZGVzY3JpcHRvcik7Ci0JCQlnZXRQcm92aWRlcklEVG9Qcm92aWRlck1hcCgpLnB1dChkZXNjcmlwdG9yLmdldElkKCksIHNlcnZpY2VQcm92aWRlcik7Ci0JCX0KLQkJCi0JCXJldHVybiBzZXJ2aWNlUHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIGZTaGVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiBmVGFibGU7Ci0JfQotCQotCS8qKgotCSAqIFN1Yi1jbGFzcyBtYXkgb3ZlcnJpZGUgYmVoYXZpb3VyCi0JICogQHJldHVybiB0cnVlIGlmIGFsbCBhdmFpbGFibGUgc2VydmljZXMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKSB7Ci0JCXJldHVybiBpc0NvbmZpZ3VyZWQobnVsbCwgZlNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklELCBnZXRQcm92aWRlcklEVG9Qcm92aWRlck1hcCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYWxsIHNlcnZpY2UgcHJvdmlkZXJzIGhhdmUgYmVlbiBjb25maWd1cmVkCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gc2VydmljZUlEVG9TZWxlY3RlZFByb3ZpZGVySUQKLQkgKiBAcGFyYW0gcHJvdmlkZXJJRFRvUHJvdmlkZXJNYXAKLQkgKiBAcmV0dXJuIHRydWUgaWYgYWxsIHNlcnZpY2UgcHJvdmlkZXJzIGhhdmUgYmVlbiBjb25maWd1cmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25maWd1cmVkKElQcm9qZWN0IHByb2plY3QsIE1hcDxTdHJpbmcsIFN0cmluZz4gc2VydmljZUlEVG9TZWxlY3RlZFByb3ZpZGVySUQsIE1hcDxTdHJpbmcsIElTZXJ2aWNlUHJvdmlkZXI+IHByb3ZpZGVySURUb1Byb3ZpZGVyTWFwKSB7Ci0JCVNldDxJU2VydmljZT4gYWxsQXBwbGljYWJsZVNlcnZpY2VzID0gZ2V0Q29udHJpYnV0ZWRTZXJ2aWNlcyhwcm9qZWN0KTsKLQkJSXRlcmF0b3I8SVNlcnZpY2U+IGl0ZXJhdG9yID0gYWxsQXBwbGljYWJsZVNlcnZpY2VzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gY29uZmlndXJlZCA9IHRydWU7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBwcm92aWRlcklEID0gc2VydmljZUlEVG9TZWxlY3RlZFByb3ZpZGVySUQuZ2V0KGl0ZXJhdG9yLm5leHQoKS5nZXRJZCgpKTsKLQkJCWlmIChwcm92aWRlcklEID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZSB7Ci0JCQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IHByb3ZpZGVySURUb1Byb3ZpZGVyTWFwLmdldChwcm92aWRlcklEKTsKLQkJCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJY29uZmlndXJlZCA9IGNvbmZpZ3VyZWQgJiYgcHJvdmlkZXIuaXNDb25maWd1cmVkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyZWQ7Ci0JfQotCQotCS8qKgotCSAqIExpc3RlbnMgZm9yIGNoYW5nZXMgaW4gc2VydmljZSBwcm92aWRlciBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGNvbmZpZ0NoYW5nZUxpc3RlbmVyIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZSBsaXN0ZW5lciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWdDaGFuZ2VMaXN0ZW5lcihMaXN0ZW5lciBjb25maWdDaGFuZ2VMaXN0ZW5lcikgewotCQlmQ29uZmlnQ2hhbmdlTGlzdGVuZXIgPSBjb25maWdDaGFuZ2VMaXN0ZW5lcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXJJRFRvUHJvdmlkZXJNYXAoCi0JCQlNYXA8U3RyaW5nLCBJU2VydmljZVByb3ZpZGVyPiBwcm92aWRlcklEVG9Qcm92aWRlck1hcCkgewotCQlmUHJvdmlkZXJJRFRvUHJvdmlkZXJNYXAgPSBwcm92aWRlcklEVG9Qcm92aWRlck1hcDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd2lkZ2V0Ci0JICogCi0JICogQHBhcmFtIHNlcnZpY2UgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJZlNlcnZpY2VDb25maWd1cmF0aW9uID0gY29uZmlnOwotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCWNyZWF0ZVRhYmxlQ29udGVudCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEKAotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBzZXJ2aWNlSURUb1NlbGVjdGVkUHJvdmlkZXJJRCkgewotCQlmU2VydmljZUlEVG9TZWxlY3RlZFByb3ZpZGVySUQgPSBzZXJ2aWNlSURUb1NlbGVjdGVkUHJvdmlkZXJJRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShUYWJsZSB0YWJsZSkgewotCQlmVGFibGUgPSB0YWJsZTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFkZFJlbW92ZUJ1dHRvbnMoKSB7Ci0JCVNldDxJU2VydmljZT4gc2VydmljZXMgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2VydmljZXMoKTsKLQkJZkFkZEJ1dHRvbi5zZXRFbmFibGVkKHNlcnZpY2VzLnNpemUoKSA+IGZUYWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmVGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgdGhlIGNvbmZpZ3VyZSBidXR0b24gaW4gdGhpcyB3aWRnZXQgYmFzZWQgb24gdGhlIHNlcnZpY2UgcHJvdmlkZXIgZGVzY3JpcHRvciBzZWxlY3RlZAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29uZmlndXJlQnV0dG9uKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yIGNvbmZpZyA9IFNlcnZpY2VNb2RlbFVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yKGRlc2NyaXB0b3IpOwotCQlmQ29uZmlndXJlQnV0dG9uLnNldEVuYWJsZWQoY29uZmlnICE9IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9OZXdTZXJ2aWNlQ29uZmlndXJhdGlvblByb2plY3RXaXphcmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9OZXdTZXJ2aWNlQ29uZmlndXJhdGlvblByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlYmZiMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvTmV3U2VydmljZUNvbmZpZ3VyYXRpb25Qcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgTmV3U2VydmljZUNvbmZpZ3VyYXRpb25Qcm9qZWN0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQlwcml2YXRlIGNsYXNzIEludHJvUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JCXB1YmxpYyBJbnRyb1BhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCQlzZXRUaXRsZShwYWdlTmFtZSk7Ci0JCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF8yKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNhbnZhcyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGNhbnZhc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCWNhbnZhcy5zZXRMYXlvdXQoY2FudmFzTGF5b3V0KTsKLQkJCQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2FudmFzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkXzMpOwotCQkJCi0JCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwoY2FudmFzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbDIuc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF80KTsKLQkJCQotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY2FudmFzLCBTV1QuQ0hFQ0spOwotCQkJYnV0dG9uLnNldFRleHQoTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfNSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJc2V0Q29udHJvbChjYW52YXMpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIElXb3JrYmVuY2ggZldvcmtiZW5jaCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgTmV3U2VydmljZUNvbmZpZ3VyYXRpb25Qcm9qZWN0V2l6YXJkKCkgewotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEludHJvUGFnZShNZXNzYWdlcy5TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZF82KSk7Ci0JCWFkZFBhZ2UobmV3IFNlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2l6YXJkUGFnZSgiU2VydmljZSBDb25maWd1cmF0aW9uIFNlbGVjdGlvbiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgU2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgV29ya2JlbmNoCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gZldvcmtiZW5jaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaXphcmRQYWdlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOWE4NDQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aXphcmRzL1NlcnZpY2VDb25maWd1cmF0aW9uU2VsZWN0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkU2VsZWN0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIGNsYXNzIFNlcnZpY2VOb2RlIGltcGxlbWVudHMgSVdpemFyZE5vZGUgewotCQlwcml2YXRlIElOZXdXaXphcmQgZldpemFyZCA9IG51bGw7Ci0JCXByaXZhdGUgSVdvcmtiZW5jaCBmV29ya2JlbmNoID0gbnVsbDsKLQkJcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uID0gbnVsbDsKLQotCQlwdWJsaWMgU2VydmljZU5vZGUoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJCWZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGUjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZSNnZXRFeHRlbnQoKQotCQkgKi8KLQkJcHVibGljIFBvaW50IGdldEV4dGVudCgpIHsKLQkJCXJldHVybiBuZXcgUG9pbnQoLTEsIC0xKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGUjZ2V0V2l6YXJkKCkKLQkJICovCi0JCXB1YmxpYyBJV2l6YXJkIGdldFdpemFyZCgpIHsKLQkJCWlmIChmV2l6YXJkID09IG51bGwpIHsKLQkJCQlmV2l6YXJkID0gbmV3IFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkKGdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkpOwotCQkJCWZXaXphcmQuYWRkUGFnZXMoKTsKLQkJCQlmV2l6YXJkLmluaXQoZldvcmtiZW5jaCwgZlNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gZldpemFyZDsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGUjaXNDb250ZW50Q3JlYXRlZCgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRDcmVhdGVkKCkgewotCQkJcmV0dXJuIGZXaXphcmQgIT0gbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBJU2VydmljZUNvbmZpZ3VyYXRpb24gZlNlcnZpY2VDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGZXaXphcmQKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgU2VydmljZUNvbmZpZ3VyYXRpb25TZWxlY3Rpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oIkNyZWF0ZSBvciBzZWxlY3QgYSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9qZWN0Iik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKLSAgICAgICAgCi0gICAgICAgIElTZXJ2aWNlTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBtYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY29uZmlncy5zaXplKCkgPiAwKSB7Ci0JICAgICAgICBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTEVGVCk7Ci0JICAgICAgICBsYWJlbDEuc2V0VGV4dCgiT25lIG9yIG1vcmUgc2VydmljZSBjb25maWd1cmF0aW9ucyBhbHJlYWR5IGV4aXN0LiIpOwotCi0JICAgICAgICBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTEVGVCk7Ci0JICAgICAgICBsYWJlbDIuc2V0VGV4dCgiSWYgeW91IHdpc2ggdG8gdXNlIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24sIHNlbGVjdCBpdCBmcm9tIHRoZSBsaXN0LiIpOwotCSAgICAgICAgCi0JICAgICAgICBuZXcgU2VydmljZUNvbmZpZ3VyYXRpb25XaWRnZXQoY29uZmlncykuY3JlYXRlQ29udGVudHMoY29udGFpbmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5MRUZUKTsKLQkgICAgICAgIGxhYmVsMS5zZXRUZXh0KCJZb3UgZG8gbm90IGhhdmUgYW55IGV4aXN0aW5nIHNlcnZpY2UgY29uZmlndXJhdGlvbnMsIHNvIHRoaXMgd2l6YXJkIHdpbGwgaGVscCB5b3UgY3JlYXRlIGEgbmV3IG9uZS4iKTsKLQotCSAgICAgICAgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkxFRlQpOwotCSAgICAgICAgbGFiZWwyLnNldFRleHQoIlRoZSBuZXcgY29uZmlndXJhdGlvbiB3aWxsIGJlIHNhdmVkIHdpdGggeW91ciBwcm9qZWN0LCBhbmQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgcHJvamVjdHMgaW4gdGhlIGZ1dHVyZS4iKTsKLQkgICAgICAgIAotCSAgICAgICAgSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZyA9IG1hbmFnZXIubmV3U2VydmljZUNvbmZpZ3VyYXRpb24oIkRlZmF1bHQiKTsKLQkgICAgICAgIGZvciAoSVNlcnZpY2Ugc2VydmljZSA6IG1hbmFnZXIuZ2V0U2VydmljZXMoKSkgewotCQkJCVNvcnRlZFNldDxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4gcHJvdmlkZXJzID0gc2VydmljZS5nZXRQcm92aWRlcnNCeVByaW9yaXR5KCk7Ci0JCQkJaWYgKHByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2VydmljZVByb3ZpZGVyKHByb3ZpZGVycy5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJCWNvbmZpZy5zZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSwgcHJvdmlkZXIpOwotCQkJCX0KLQkJCX0KLQkgICAgICAgIAotCSAgICAgICAgc2V0U2VydmljZUNvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkgICAgICAgIHNldFNlbGVjdGVkTm9kZShuZXcgU2VydmljZU5vZGUoKChOZXdTZXJ2aWNlQ29uZmlndXJhdGlvblByb2plY3RXaXphcmQpZ2V0V2l6YXJkKCkpLmdldFdvcmtiZW5jaCgpLCAoKE5ld1NlcnZpY2VDb25maWd1cmF0aW9uUHJvamVjdFdpemFyZClnZXRXaXphcmQoKSkuZ2V0U2VsZWN0aW9uKCkpKTsKLSAgICAgICAgfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGZTZXJ2aWNlQ29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgSVNlcnZpY2VDb25maWd1cmF0aW9uIGdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gZlNlcnZpY2VDb25maWd1cmF0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZlNlcnZpY2VDb25maWd1cmF0aW9uIHRoZSBmU2VydmljZUNvbmZpZ3VyYXRpb24gdG8gc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlcnZpY2VDb25maWd1cmF0aW9uKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBmU2VydmljZUNvbmZpZ3VyYXRpb24pIHsKLQkJdGhpcy5mU2VydmljZUNvbmZpZ3VyYXRpb24gPSBmU2VydmljZUNvbmZpZ3VyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aXphcmRzL1NlcnZpY2VDb25maWd1cmF0aW9uV2lkZ2V0LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZUNvbmZpZ3VyYXRpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYmRlMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZUNvbmZpZ3VyYXRpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlRhYmxlQ29sdW1uTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLlNlcnZpY2VzVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuU2VydmljZU1vZGVsVUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5kaWFsb2dzLlNlcnZpY2VzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiA8c3Ryb25nPkVYUEVSSU1FTlRBTDwvc3Ryb25nPi4gVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgYXMKLSAqIHBhcnQgb2YgYSB3b3JrIGluIHByb2dyZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIEFQSSB3aWxsIHdvcmsgb3IKLSAqIHRoYXQgaXQgd2lsbCByZW1haW4gdGhlIHNhbWUuIFBsZWFzZSBkbyBub3QgdXNlIHRoaXMgQVBJIHdpdGhvdXQgY29uc3VsdGluZwotICogd2l0aCB0aGUgUkRUIHRlYW0uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VDb25maWd1cmF0aW9uV2lkZ2V0IGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JCi0JcHVibGljIGNsYXNzIEFkZExpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJU2V0PElTZXJ2aWNlPiBkaXNwbGF5U2V0ID0gbmV3IEhhc2hTZXQ8SVNlcnZpY2U+KCk7Ci0JCQlTZXQ8SVNlcnZpY2U+IGNvbmZpZ1NlcnZpY2VzID0gZ2V0U2VydmljZUNvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpOwotCQkJZm9yIChJU2VydmljZSBzZXJ2aWNlIDogU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2VzKCkpIHsKLQkJCQlpZiAoIWNvbmZpZ1NlcnZpY2VzLmNvbnRhaW5zKHNlcnZpY2UpKSB7Ci0JCQkJCWRpc3BsYXlTZXQuYWRkKHNlcnZpY2UpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJU2VydmljZXNEaWFsb2cgZGlhbG9nID0gbmV3IFNlcnZpY2VzRGlhbG9nKGdldFNoZWxsKCksIGRpc3BsYXlTZXQudG9BcnJheShuZXcgSVNlcnZpY2VbMF0pKTsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IERpYWxvZy5PSykgewotCQkJCUlTZXJ2aWNlW10gc2VsZWN0ZWRTZXJ2aWNlcyA9IGRpYWxvZy5nZXRTZWxlY3RlZFNlcnZpY2VzKCk7Ci0JCQkJZm9yIChJU2VydmljZSBzZXJ2aWNlIDogc2VsZWN0ZWRTZXJ2aWNlcykgewotCQkJCQlTb3J0ZWRTZXQ8SVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I+IHByb3ZpZGVycyA9IGdldFByb3ZpZGVyc0J5UHJpb3JpdHkoc2VydmljZSk7Ci0JCQkJCWlmIChwcm92aWRlcnMuc2l6ZSgpID4gMCkgewotCQkJCQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXJzLml0ZXJhdG9yKCkubmV4dCgpKTsKLS8vCQkJCQkJYWRkVGFibGVSb3coc2VydmljZSwgcHJvdmlkZXIpOwotCQkJCQkJZ2V0U2VydmljZUNvbmZpZ3VyYXRpb24oKS5zZXRTZXJ2aWNlUHJvdmlkZXIoc2VydmljZSwgcHJvdmlkZXIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU2VydmljZXNVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLlNlcnZpY2VNb2RlbFdpZGdldF84LCBzZXJ2aWNlLmdldElkKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl1cGRhdGVBZGRSZW1vdmVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIENvbmZpZ3VyZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJLy8gbGF1bmNoIHRoZSBjb25maWd1cmF0aW9uIFVJIGZvciB0aGUgc2VydmljZSBwcm92aWRlcgotCQkJVGFibGVJdGVtW10gc2VsZWN0aW9uID0gZlRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVRhYmxlSXRlbSBpdGVtID0gc2VsZWN0aW9uWzBdOwotCQkJSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciA9IChJU2VydmljZVByb3ZpZGVyKSBpdGVtLmdldERhdGEoUFJPVklERVJfS0VZKTsKLQotCQkJSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yIGNvbnRyaWIgPSBTZXJ2aWNlTW9kZWxVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvcihwcm92aWRlcik7Ci0JCQlJV2l6YXJkIHdpemFyZCA9IGNvbnRyaWIuZ2V0V2l6YXJkKHByb3ZpZGVyLCBudWxsKTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJCi0JCQlTdHJpbmcgY29uZmlnU3RyaW5nID0gcHJvdmlkZXIuZ2V0Q29uZmlndXJhdGlvblN0cmluZygpOwotCQkJLy8gY29sdW1uIDIgaG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIG9mIHRoZSBwcm92aWRlcidzIGN1cnJlbnQgY29uZmlndXJhdGlvbiAKLQkJCWlmIChjb25maWdTdHJpbmcgPT0gbnVsbCkgewotCQkJCWNvbmZpZ1N0cmluZyA9IE1lc3NhZ2VzLlNlcnZpY2VNb2RlbFdpZGdldF80OwotCQkJfQotCQkJaXRlbS5zZXRUZXh0KDIsIGNvbmZpZ1N0cmluZyk7Ci0JCQkKLQkJCS8vIGFsbG93IGNvbnRhaW5lciBwYWdlIHRvIGNoZWNrIGlmIGNvbmZpZ3VyYXRpb25zIGFyZSBzZXQKLQkJCWlmIChmQ29uZmlnQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWZDb25maWdDaGFuZ2VMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgUmVtb3ZlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGZUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZvciAoVGFibGVJdGVtIGl0ZW0gOiBpdGVtcykgewotCQkJCUlTZXJ2aWNlIHNlcnZpY2UgPSAoSVNlcnZpY2UpIGl0ZW0uZ2V0RGF0YShTRVJWSUNFX0tFWSk7Ci0JCQkJaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotCQkJCQlnZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpLmRpc2FibGUoc2VydmljZSk7Ci0JCQkJfQotCQkJCWZUYWJsZS5yZW1vdmUoZlRhYmxlLmluZGV4T2YoaXRlbSkpOwotCQkJfQotCQkJdXBkYXRlQWRkUmVtb3ZlQnV0dG9ucygpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX0tFWSA9ICJwcm92aWRlci1pZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0tFWSA9ICJzZXJ2aWNlLWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IGZTZXJ2aWNlQ29uZmlndXJhdGlvbnM7Ci0JcHJvdGVjdGVkIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBmU2VydmljZUNvbmZpZ3VyYXRpb247Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZlNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEOwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJU2VydmljZVByb3ZpZGVyPiBmUHJvdmlkZXJJRFRvUHJvdmlkZXJNYXA7Ci0JcHJvdGVjdGVkIFRhYmxlIGZUYWJsZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDb25maWd1cmVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQWRkQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZlJlbW92ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgTGlzdGVuZXIgZkNvbmZpZ0NoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCBmV29ya2JlbmNoID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbiA9IG51bGw7Ci0JCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uV2lkZ2V0KFNldDxJU2VydmljZUNvbmZpZ3VyYXRpb24+IHNlcnZpY2VDb25maWd1cmF0aW9ucykgewotCQlmU2VydmljZUNvbmZpZ3VyYXRpb25zID0gc2VydmljZUNvbmZpZ3VyYXRpb25zOwotCX0KLQkKLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjYW52YXMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGNhbnZhc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJY2FudmFzLnNldExheW91dChjYW52YXNMYXlvdXQpOwotCQkKLQkJQ29tcG9zaXRlIHRhYmxlUGFyZW50ID0gbmV3IENvbXBvc2l0ZShjYW52YXMsIFNXVC5OT05FKTsKLQkJdGFibGVQYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQotCQlmVGFibGUgPSBuZXcgVGFibGUgKHRhYmxlUGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMKTsKLQkJZlRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JCWZUYWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQkJCi0JCVRhYmxlQ29sdW1uTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUNvbHVtbkxheW91dCgpOwotCQlTdHJpbmdbXSB0aXRsZXMgPSB7IlByb2plY3QiLCAiQ29uZmlndXJhdGlvbiIsICJTdGF0dXMifTsKLQkJZm9yIChpbnQgaT0wOyBpPHRpdGxlcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uIChmVGFibGUsIFNXVC5OT05FKTsKLQkJCWNvbHVtbi5zZXRUZXh0ICh0aXRsZXMgW2ldKTsKLQkJCWludCB3aWR0aCA9IENvbHVtbldlaWdodERhdGEuTUlOSU1VTV9XSURUSDsKLQkJCQotCQkJLy8gc2V0IHRoZSBjb2x1bW4gd2lkdGhzCi0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgMDogLy8gUHJvamVjdCBuYW1lLi4uIHVzdWFsbHkgc2hvcnQKLQkJCQl3aWR0aCA9IDEwMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOiAvLyBDb25maWd1YXRpb24gbmFtZS4uLiB1c3VhbGx5IHNob3J0Ci0JCQkJd2lkdGggPSAxMDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjogLy8gY29uZmlndXJhdGlvbiBzdGF0dXMuLi4gdHlwaWNhbGx5IHNob3J0Ci0JCQkJd2lkdGggPSAxMDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCX0KLQkJCQotCQkJbGF5b3V0LnNldENvbHVtbkRhdGEoY29sdW1uLCBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxLCB3aWR0aCwgdHJ1ZSkpOwotCQkJCi0KLQkJfQotCQl0YWJsZVBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZlRhYmxlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCWNyZWF0ZVRhYmxlQ29udGVudCgpOwotCQkKLQkJZlRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uUGFyZW50ID0gbmV3IENvbXBvc2l0ZShjYW52YXMsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBidXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJYnV0dG9uUGFyZW50LnNldExheW91dChidXR0b25MYXlvdXQpOwotCQlidXR0b25QYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJZkNvbmZpZ3VyZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFyZW50LCBTV1QuUFVTSCk7Ci0JCWZDb25maWd1cmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZDb25maWd1cmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlTW9kZWxXaWRnZXRfMik7Ci0JCWZDb25maWd1cmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUxpc3RlbmVyIGNvbmZpZ3VyZUxpc3RlbmVyID0gZ2V0Q29uZmlndXJlTGlzdGVuZXIoKTsKLQkJZkNvbmZpZ3VyZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBjb25maWd1cmVMaXN0ZW5lcik7Ci0JCQotCQlmQWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYXJlbnQsIFNXVC5QVVNIKTsKLQkJZkFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlmQWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuU2VydmljZU1vZGVsV2lkZ2V0XzYpOwotCQlmQWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlMaXN0ZW5lciBhZGRMaXN0ZW5lciA9IGdldEFkZExpc3RlbmVyKCk7Ci0JCWZBZGRCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWRkTGlzdGVuZXIpOwotCQkKLQkJZlJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFyZW50LCBTV1QuUFVTSCk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5TZXJ2aWNlTW9kZWxXaWRnZXRfNyk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUxpc3RlbmVyIHJlbW92ZUxpc3RlbmVyID0gZ2V0UmVtb3ZlTGlzdGVuZXIoKTsKLQkJZlJlbW92ZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCByZW1vdmVMaXN0ZW5lcik7Ci0KLQkJdXBkYXRlQWRkUmVtb3ZlQnV0dG9ucygpOwotCQkKLQkJcmV0dXJuIGNhbnZhczsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXIgZ2V0Q29uZmlnQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBmQ29uZmlnQ2hhbmdlTGlzdGVuZXI7Ci0JfQotCQotCXB1YmxpYyBNYXA8U3RyaW5nLCBJU2VydmljZVByb3ZpZGVyPiBnZXRQcm92aWRlcklEVG9Qcm92aWRlck1hcCgpIHsKLQkJcmV0dXJuIGZQcm92aWRlcklEVG9Qcm92aWRlck1hcDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd2lkZ2V0Ci0JICogCi0JICogQHJldHVybiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VDb25maWd1cmF0aW9uIGdldFNlcnZpY2VDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gZlNlcnZpY2VDb25maWd1cmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTZXJ2aWNlSURUb1NlbGVjdGVkUHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuIGZTZXJ2aWNlSURUb1NlbGVjdGVkUHJvdmlkZXJJRDsKLQl9Ci0JCi0JcHVibGljIFRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gZlRhYmxlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogU3ViLWNsYXNzIG1heSBvdmVycmlkZSBiZWhhdmlvdXIKLQkgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGF2YWlsYWJsZSBzZXJ2aWNlcyBoYXZlIGJlZW4gY29uZmlndXJlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZCgpIHsKLQkJcmV0dXJuIGlzQ29uZmlndXJlZChudWxsLCBmU2VydmljZUlEVG9TZWxlY3RlZFByb3ZpZGVySUQsIGdldFByb3ZpZGVySURUb1Byb3ZpZGVyTWFwKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyBmb3IgY2hhbmdlcyBpbiBzZXJ2aWNlIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gY29uZmlnQ2hhbmdlTGlzdGVuZXIgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGxpc3RlbmVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZ0NoYW5nZUxpc3RlbmVyKExpc3RlbmVyIGNvbmZpZ0NoYW5nZUxpc3RlbmVyKSB7Ci0JCWZDb25maWdDaGFuZ2VMaXN0ZW5lciA9IGNvbmZpZ0NoYW5nZUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3ZpZGVySURUb1Byb3ZpZGVyTWFwKAotCQkJTWFwPFN0cmluZywgSVNlcnZpY2VQcm92aWRlcj4gcHJvdmlkZXJJRFRvUHJvdmlkZXJNYXApIHsKLQkJZlByb3ZpZGVySURUb1Byb3ZpZGVyTWFwID0gcHJvdmlkZXJJRFRvUHJvdmlkZXJNYXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUlEVG9TZWxlY3RlZFByb3ZpZGVySUQoCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEKSB7Ci0JCWZTZXJ2aWNlSURUb1NlbGVjdGVkUHJvdmlkZXJJRCA9IHNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklEOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCWZUYWJsZSA9IHRhYmxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUYWJsZVJvdyhJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAoZlRhYmxlLCBTV1QuTk9ORSk7Ci0KLQkJLy8gY29sdW1uIDAgbGlzdHMgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLQkJaXRlbS5zZXRUZXh0ICgwLCBjb25maWcuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIGNvbHVtbiAxIGhvbGRzIHRoZSBzdGF0dXMgc3RyaW5nCi0JCWl0ZW0uc2V0VGV4dCgxLCAiTm90IGNvbmZpZ3VyZWQiKTsKLQotCQlpdGVtLnNldERhdGEoU0VSVklDRV9LRVksIGNvbmZpZyk7Ci0KLQkJLy8gYWxsb3cgY29udGFpbmVyIHBhZ2UgdG8gY2hlY2sgaWYgY29uZmlndXJhdGlvbnMgYXJlIHNldAotCQlpZiAoZkNvbmZpZ0NoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZDb25maWdDaGFuZ2VMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiBwcm92aWRlcnMgc29ydGVkIGJ5IHByaW9yaXR5Ci0JICogCi0JICogQHBhcmFtIHNlcnZpY2Ugc2VydmljZSBjb250YWluaW5nIHByb3ZpZGVycwotCSAqIEByZXR1cm4gc29ydGVkIHByb3ZpZGVycwotCSAqLwotCXByaXZhdGUgU29ydGVkU2V0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPiBnZXRQcm92aWRlcnNCeVByaW9yaXR5KElTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJU29ydGVkU2V0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPiBzb3J0ZWRQcm92aWRlcnMgPSAKLQkJCW5ldyBUcmVlU2V0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPihuZXcgQ29tcGFyYXRvcjxJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvcj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yIG8xLCBJU2VydmljZVByb3ZpZGVyRGVzY3JpcHRvciBvMikgewotCQkJCQlyZXR1cm4gbzIuZ2V0UHJpb3JpdHkoKS5jb21wYXJlVG8obzEuZ2V0UHJpb3JpdHkoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCWZvciAoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgcCA6IHNlcnZpY2UuZ2V0UHJvdmlkZXJzKCkpIHsKLQkJCXNvcnRlZFByb3ZpZGVycy5hZGQocCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzb3J0ZWRQcm92aWRlcnM7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHRoZSBzZXJ2aWNlIHByb3ZpZGVyIGZvciB0aGUgZGVzY3JpcHRvci4gS2VlcHMgYSBjYWNoZSBvZiBzZXJ2aWNlIHByb3ZpZGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciBkZXNjcmlwdG9yIGZvciB0aGUgc2VydmljZSBwcm92aWRlcgotCSAqIEByZXR1cm4gc2VydmljZSBwcm92aWRlcgotCSAqLwotCXByaXZhdGUgSVNlcnZpY2VQcm92aWRlciBnZXRTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJU2VydmljZVByb3ZpZGVyIHNlcnZpY2VQcm92aWRlciA9IGdldFByb3ZpZGVySURUb1Byb3ZpZGVyTWFwKCkuZ2V0KGRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCQotCQlpZiAoc2VydmljZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VQcm92aWRlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlUHJvdmlkZXIoZGVzY3JpcHRvcik7Ci0JCQlnZXRQcm92aWRlcklEVG9Qcm92aWRlck1hcCgpLnB1dChkZXNjcmlwdG9yLmdldElkKCksIHNlcnZpY2VQcm92aWRlcik7Ci0JCX0KLQkJCi0JCXJldHVybiBzZXJ2aWNlUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlIHRoZSBzZXJ2aWNlcywgcHJvdmlkZXJzIGFuZCBwcm92aWRlciBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSBmb3IKLQkgKiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBpbiB0aGUgdGFibGUKLQkgKiAKLQkgKiBTdWItY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaXRzIGJlaGF2aW91cgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb250ZW50KCkgewotCQlmVGFibGUucmVtb3ZlQWxsKCk7Ci0JCQotCQlmb3IgKElTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgOiBmU2VydmljZUNvbmZpZ3VyYXRpb25zKSB7Ci0JCQlhZGRUYWJsZVJvdyhjb25maWcpOwotCQl9Ci0JfQotCQotCS8vc3ViIGNsYXNzIG1heSBvdmVycmlkZSB0byBjaGFuZ2UgYmVoYXZpb3VyCi0JcHJvdGVjdGVkIExpc3RlbmVyIGdldEFkZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkZExpc3RlbmVyKCk7CQkKLQl9Ci0JCi0JLy9zdWIgY2xhc3MgbWF5IG92ZXJyaWRlIHRvIGNoYW5nZSBiZWhhdmlvdXIKLQlwcm90ZWN0ZWQgTGlzdGVuZXIgZ2V0Q29uZmlndXJlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29uZmlndXJlTGlzdGVuZXIoKTsJCQotCX0KLQotCS8qKgotCSAqIEZpbmQgYXZhaWxhYmxlIHJlbW90ZSBzZXJ2aWNlcyBhbmQgc2VydmljZSBwcm92aWRlcnMgZm9yIGEgZ2l2ZW4gcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBTZXQ8SVNlcnZpY2U+IGdldENvbnRyaWJ1dGVkU2VydmljZXMoSVByb2plY3QgcHJvamVjdCkgewkJCi0JCUlTZXJ2aWNlTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU2V0PElTZXJ2aWNlPiBhbGxBcHBsaWNhYmxlU2VydmljZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJU2VydmljZT4oKTsKLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCi0JCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBuZXcgU3RyaW5nW10ge307CQkJCi0JCQl0cnkgewotCQkJCS8vZ2V0IHRoZSBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIHByb2plY3QKLQkJCQluYXR1cmVJZHMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7CQkJCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQkJCi0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYXR1cmVJZCA9IG5hdHVyZUlkc1tpXTsKLQkJCQlTZXQ8SVNlcnZpY2U+IHNlcnZpY2VzID0gbW9kZWxNYW5hZ2VyLmdldFNlcnZpY2VzKG5hdHVyZUlkKTsKLQkJCQlpZiAoc2VydmljZXMgIT0gbnVsbCkKLQkJCQkJYWxsQXBwbGljYWJsZVNlcnZpY2VzLmFkZEFsbChzZXJ2aWNlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbEFwcGxpY2FibGVTZXJ2aWNlczsKLQl9Ci0JCQotCS8vc3ViIGNsYXNzIG1heSBvdmVycmlkZSB0byBjaGFuZ2UgYmVoYXZpb3VyCi0JcHJvdGVjdGVkIExpc3RlbmVyIGdldFJlbW92ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFJlbW92ZUxpc3RlbmVyKCk7CQkKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGFsbCBzZXJ2aWNlIHByb3ZpZGVycyBoYXZlIGJlZW4gY29uZmlndXJlZAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklECi0JICogQHBhcmFtIHByb3ZpZGVySURUb1Byb3ZpZGVyTWFwCi0JICogQHJldHVybiB0cnVlIGlmIGFsbCBzZXJ2aWNlIHByb3ZpZGVycyBoYXZlIGJlZW4gY29uZmlndXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29uZmlndXJlZChJUHJvamVjdCBwcm9qZWN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklELCBNYXA8U3RyaW5nLCBJU2VydmljZVByb3ZpZGVyPiBwcm92aWRlcklEVG9Qcm92aWRlck1hcCkgewotCQlTZXQ8SVNlcnZpY2U+IGFsbEFwcGxpY2FibGVTZXJ2aWNlcyA9IGdldENvbnRyaWJ1dGVkU2VydmljZXMocHJvamVjdCk7Ci0JCUl0ZXJhdG9yPElTZXJ2aWNlPiBpdGVyYXRvciA9IGFsbEFwcGxpY2FibGVTZXJ2aWNlcy5pdGVyYXRvcigpOwotCQlib29sZWFuIGNvbmZpZ3VyZWQgPSB0cnVlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcHJvdmlkZXJJRCA9IHNlcnZpY2VJRFRvU2VsZWN0ZWRQcm92aWRlcklELmdldChpdGVyYXRvci5uZXh0KCkuZ2V0SWQoKSk7Ci0JCQlpZiAocHJvdmlkZXJJRCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UgewotCQkJCUlTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIgPSBwcm92aWRlcklEVG9Qcm92aWRlck1hcC5nZXQocHJvdmlkZXJJRCk7Ci0JCQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCWNvbmZpZ3VyZWQgPSBjb25maWd1cmVkICYmIHByb3ZpZGVyLmlzQ29uZmlndXJlZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb25maWd1cmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFkZFJlbW92ZUJ1dHRvbnMoKSB7Ci0JCVNldDxJU2VydmljZT4gc2VydmljZXMgPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2VydmljZXMoKTsKLQkJZkFkZEJ1dHRvbi5zZXRFbmFibGVkKHNlcnZpY2VzLnNpemUoKSA+IGZUYWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JCWZSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmVGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSB0aGUgY29uZmlndXJlIGJ1dHRvbiBpbiB0aGlzIHdpZGdldCBiYXNlZCBvbiB0aGUgc2VydmljZSBwcm92aWRlciBkZXNjcmlwdG9yIHNlbGVjdGVkCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb25maWd1cmVCdXR0b24oSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IgY29udHJpYiA9IFNlcnZpY2VNb2RlbFVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yKGRlc2NyaXB0b3IpOwotCQlmQ29uZmlndXJlQnV0dG9uLnNldEVuYWJsZWQoY29udHJpYiAhPSBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhlNTJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLlNlcnZpY2VNb2RlbFVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpZGdldHMuU2VydmljZU1vZGVsV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCXByaXZhdGUgY2xhc3MgU2VydmljZXNQYWdlIGV4dGVuZHMgV2l6YXJkU2VsZWN0aW9uUGFnZSB7Ci0JCXByaXZhdGUgY2xhc3MgV2l6YXJkRXh0ZW5zaW9uTm9kZSBpbXBsZW1lbnRzIElXaXphcmROb2RlIHsKLQkJCXByaXZhdGUgSVdpemFyZCBmV2l6YXJkID0gbnVsbDsKLQkJCQotCQkJcHVibGljIFdpemFyZEV4dGVuc2lvbk5vZGUoSVdpemFyZCB3aXphcmQpIHsKLQkJCQlmV2l6YXJkID0gd2l6YXJkOwotCQkJfQotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZSNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGUjZ2V0RXh0ZW50KCkKLQkJCSAqLwotCQkJcHVibGljIFBvaW50IGdldEV4dGVudCgpIHsKLQkJCQlyZXR1cm4gbmV3IFBvaW50KC0xLCAtMSk7Ci0JCQl9Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmROb2RlI2dldFdpemFyZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBJV2l6YXJkIGdldFdpemFyZCgpIHsKLQkJCQlyZXR1cm4gZldpemFyZDsKLQkJCX0KLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGUjaXNDb250ZW50Q3JlYXRlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGlzQ29udGVudENyZWF0ZWQoKSB7Ci0JCQkJcmV0dXJuIGZXaXphcmQgIT0gbnVsbDsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgU2VydmljZXNQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQkJc3VwZXIocGFnZU5hbWUpOwotCQkJc2V0VGl0bGUocGFnZU5hbWUpOwotCQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfMCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXNldENvbnRyb2wobmV3IFNlcnZpY2VNb2RlbFdpZGdldChmU2VydmljZUNvbmZpZ3VyYXRpb24pLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCkpOwotCQkJSU5ld1dpemFyZCB3aXphcmQgPSAoSU5ld1dpemFyZClTZXJ2aWNlTW9kZWxVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRXaXphcmRFeHRlbnNpb25zKCk7Ci0JCQlpZiAod2l6YXJkICE9IG51bGwpIHsKLQkJCQl3aXphcmQuaW5pdChnZXRXb3JrYmVuY2goKSwgZ2V0U2VsZWN0aW9uKCkpOwotCQkJCXdpemFyZC5hZGRQYWdlcygpOwotCQkJCXNldFNlbGVjdGVkTm9kZShuZXcgV2l6YXJkRXh0ZW5zaW9uTm9kZSh3aXphcmQpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgSVNlcnZpY2VDb25maWd1cmF0aW9uIGZTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIElXb3JrYmVuY2ggZldvcmtiZW5jaCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBTZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZChJU2VydmljZUNvbmZpZ3VyYXRpb24gc2VydmljZUNvbmZpZ3VyYXRpb24pIHsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlmU2VydmljZUNvbmZpZ3VyYXRpb24gPSBzZXJ2aWNlQ29uZmlndXJhdGlvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXNldFdpemFyZFBhZ2VzKGdldFdpemFyZFBhZ2VzRnJvbVNlcnZpY2VDb25maWd1cmF0aW9uKGZTZXJ2aWNlQ29uZmlndXJhdGlvbikpOwotCQlhZGRQYWdlKG5ldyBTZXJ2aWNlc1BhZ2UoTWVzc2FnZXMuU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRfMSkpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElTZXJ2aWNlQ29uZmlndXJhdGlvbiBnZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGZTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgV29ya2JlbmNoCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gZldvcmtiZW5jaDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIFdpemFyZFBhZ2VbXSBnZXRXaXphcmRQYWdlc0Zyb21TZXJ2aWNlQ29uZmlndXJhdGlvbihJU2VydmljZUNvbmZpZ3VyYXRpb24gc2VydmljZUNvbmZpZ3VyYXRpb24pIHsKLQkJTGlzdDxXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkUGFnZT4oKTsKLQkJZm9yIChJU2VydmljZSBzZXJ2aWNlIDogc2VydmljZUNvbmZpZ3VyYXRpb24uZ2V0U2VydmljZXNCeVByaW9yaXR5KCkpIHsKLQkJCUlTZXJ2aWNlQ29udHJpYnV0b3IgY29udHJpYiA9IFNlcnZpY2VNb2RlbFVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2VDb250cmlidXRvcihzZXJ2aWNlKTsKLQkJCWlmIChjb250cmliICE9IG51bGwpIHsKLQkJCQlXaXphcmRQYWdlW10gcGFnZXMgPSBjb250cmliLmdldFdpemFyZFBhZ2VzKHNlcnZpY2UpOwotCQkJCWZvciAoV2l6YXJkUGFnZSBwYWdlIDogcGFnZXMpIHsKLQkJCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHdpemFyZFBhZ2VzLnRvQXJyYXkobmV3IFdpemFyZFBhZ2Vbd2l6YXJkUGFnZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFdpemFyZFBhZ2VzKFdpemFyZFBhZ2VbXSBwYWdlcykgewotCQlmb3IgKElXaXphcmRQYWdlIHBhZ2UgOiBwYWdlcykgewotCQkJYWRkUGFnZShwYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9TZXJ2aWNlQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwZDJmOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkuSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5TZXJ2aWNlTW9kZWxVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBmaW5hbCBJU2VydmljZSBmU2VydmljZTsKLQlwcml2YXRlIElXaXphcmQgZkNoaWxkV2l6YXJkID0gbnVsbDsKLQotCXByaXZhdGUgQXJyYXlMaXN0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPiBmUHJvdmlkZXJDb21ib0xpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yPigpOwotCQotCS8qKgotCSAqIEBwYXJhbSBmV2l6YXJkCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkUGFnZShJU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlmU2VydmljZSA9IHNlcnZpY2U7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgc2V0Q29udHJvbChjb250YWluZXIpOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgcHJvdmlkZXJMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5MRUZUKTsKLSAgICAgICAgcHJvdmlkZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkUGFnZV8wKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbWJvIHByb3ZpZGVyQ29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHByb3ZpZGVyQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICBwcm92aWRlckNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNvbWJvU2VsZWN0aW9uKHByb3ZpZGVyQ29tYm8pOwotCQkJfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVDb21ib0NvbnRlbnRzKHByb3ZpZGVyQ29tYm8pOwotCX0KLQkKLQkvKioKLSAgICAgKiBUaGUgPGNvZGU+V2l6YXJkU2VsZWN0aW9uUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgCi0gICAgICogdGhpcyA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IHBhZ2UgCi0gICAgICogb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB3aXphcmQgaWYgdGhlcmUgaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLSAgICAJaWYgKGZDaGlsZFdpemFyZCAhPSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gZkNoaWxkV2l6YXJkLmdldFN0YXJ0aW5nUGFnZSgpOwotICAgIAl9Ci0gICAgCXJldHVybiBzdXBlci5nZXROZXh0UGFnZSgpOwotICAgIH0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21ibwotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDb21ib1NlbGVjdGlvbihDb21ibyBjb21ibykgewotCQlpbnQgaW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2VQcm92aWRlcihmUHJvdmlkZXJDb21ib0xpc3QuZ2V0KGluZGV4KSk7Ci0JCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS5nZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpOwotCQljb25maWcuc2V0U2VydmljZVByb3ZpZGVyKGdldFNlcnZpY2UoKSwgcHJvdmlkZXIpOwotCQlmQ2hpbGRXaXphcmQgPSBudWxsOyAvLyBuZWVkIHRvIHNldCBmQ2hpbGRXaXphcmQgdG8gbnVsbCBzbyB3ZSBnZXQgdGhlIG5leHQgc2VydmljZSBjb25maWd1cmF0aW9uIHBhZ2UKLQkJaWYgKCFwcm92aWRlci5pc0NvbmZpZ3VyZWQoKSkgewotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IGdldE5leHRQYWdlKCk7Ci0JCQlJU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IgY29udHJpYiA9IFNlcnZpY2VNb2RlbFVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yKHByb3ZpZGVyKTsKLQkJCWlmIChjb250cmliICE9IG51bGwpIHsKLQkJCQlmQ2hpbGRXaXphcmQgPSBjb250cmliLmdldFdpemFyZChwcm92aWRlciwgcGFnZSk7Ci0JCQl9Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tYm8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb21ib0NvbnRlbnRzKENvbWJvIGNvbWJvKSB7Ci0JCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS5nZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpOwotCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gY29uZmlnLmdldFNlcnZpY2VQcm92aWRlcihnZXRTZXJ2aWNlKCkpOwotCQlpbnQgaW5kZXggPSAwOwotCQlpbnQgc2VsZWN0aW9uID0gMDsKLQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCWZvciAoSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA6IGdldFNlcnZpY2UoKS5nZXRQcm92aWRlcnNCeVByaW9yaXR5KCkpIHsKLQkJCWNvbWJvLmFkZChkZXNjcmlwdG9yLmdldE5hbWUoKSk7Ci0JCQlmUHJvdmlkZXJDb21ib0xpc3QuYWRkKGluZGV4LCBkZXNjcmlwdG9yKTsKLQkJCWlmIChkZXNjcmlwdG9yLmdldElkKCkuZXF1YWxzKHByb3ZpZGVyLmdldElkKCkpKSB7Ci0JCQkJc2VsZWN0aW9uID0gaW5kZXg7Ci0JCQl9Ci0JCQlpbmRleCsrOwotCQl9Ci0JCWNvbWJvLnNlbGVjdChzZWxlY3Rpb24pOwotCQloYW5kbGVDb21ib1NlbGVjdGlvbihjb21ibyk7Ci0JfQotCQotICAgIC8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLQkJcmV0dXJuIGZTZXJ2aWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTAxYTdiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvc2VydmljZXMvdWkvd2l6YXJkcy9TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLlNlcnZpY2VNb2RlbFVJTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcm92aWRlckNvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JcHJvdGVjdGVkIGZpbmFsIElXaXphcmRQYWdlIGZQYWdlTGluazsKLQlwcm90ZWN0ZWQgZmluYWwgSVNlcnZpY2VQcm92aWRlciBmUHJvdmlkZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHdpemFyZCB3aXRoIHBhZ2VzIGZyb20gYSBzaW5nbGUgc2VydmljZSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIgc2VydmljZSBwcm92aWRlciB3ZSBhcmUgY29uZmlndXJpbmcKLQkgKiBAcGFyYW0gcGFnZSBuZXh0IFNlcnZpY2VDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGJ5IGEgU2VydmljZUNvbmZpZ3VyYXRpb25XaXphcmQsIG9yIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIFNlcnZpY2VQcm92aWRlckNvbmZpZ3VyYXRpb25XaXphcmQoSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciwgSVdpemFyZFBhZ2UgcGFnZSkgewotCQlmUHJvdmlkZXIgPSBwcm92aWRlcjsKLQkJZlBhZ2VMaW5rID0gcGFnZTsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yIGNvbnRyaWIgPSBTZXJ2aWNlTW9kZWxVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvcihmUHJvdmlkZXIpOwotCQlpZiAoY29udHJpYiAhPSBudWxsKSB7Ci0JCQlmb3IgKElXaXphcmRQYWdlIHBhZ2UgOiBjb250cmliLmdldFdpemFyZFBhZ2VzKHRoaXMsIGZQcm92aWRlcikpIHsKLQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNnZXROZXh0UGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJSVdpemFyZFBhZ2UgbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZShwYWdlKTsKLQkJaWYgKG5leHRQYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBmUGFnZUxpbms7Ci0JCX0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9zZXJ2aWNlcy91aS93aXphcmRzL1NlcnZpY2VQcm92aWRlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZWEzNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3NlcnZpY2VzL3VpL3dpemFyZHMvU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS8uY2xhc3NwYXRoIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpLy5wcm9qZWN0IGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzEzM2QxLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjdkMmI4Li4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gTWFyIDMwIDEwOjI3OjE3IEVEVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2VlOWRhLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpLkFjdGl2YXRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iNS4wLjEwMCIsCi0gb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLnhsYy5jb3JlO2J1bmRsZS12ZXJzaW9uPSI1LjAuMCIsCi0gb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLnhsYy51aTtidW5kbGUtdmVyc2lvbj0iNi4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSIzLjUuMCIsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjEuMCIsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmU7YnVuZGxlLXZlcnNpb249IjUuMS4wIiwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkKZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS9hYm91dC5odG1sIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjc4N2QuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXByaWwgMzAsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzM0ZjcuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZWZkNzAuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IFJlbW90ZSBYTCBDL0MrKyBNYW5hZ2VkIEJ1aWxkIFVJIFBsdWdpbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotdmFyaWFibGVEZXNjcmlwdGlvbiA9IFhMIEMvQysrIENvbXBpbGVyIFJvb3QgTG9jYXRpb24KLQotI0J1aWxkIG1vZGVsIG5hbWVzCi1UYXJnZXROYW1lLnhsYy5leGUgPSBSZW1vdGUgRXhlY3V0YWJsZSAoWEwgQy9DKyspCi1UYXJnZXROYW1lLnhsYy5zbyA9IFJlbW90ZSBTaGFyZWQgTGlicmFyeSAoWEwgQy9DKyspCi1UYXJnZXROYW1lLnhsYy5saWIgPSBSZW1vdGUgU3RhdGljIExpYnJhcnkoWEwgQy9DKyspCi0KLSMgRGVmYXVsdCBDb25maWd1cmF0aW9uIE5hbWVzCi0jIFNUQVJUIE5PTi1UUkFOU0xBVEFCTEUKLUNvbmZpZ05hbWUuUmVsID0gUmVsZWFzZQotQ29uZmlnTmFtZS5EYmcgPSBEZWJ1ZwotIyBFTkQgTk9OLVRSQU5TTEFUQUJMRQotCi0jIEdlbmVyaWMgdG9vbC1jaGFpbiBuYW1lcwotVG9vbENoYWluTmFtZS5SZWw9UmVtb3RlIFhMIEMvQysrIFRvb2wgQ2hhaW4KLVRvb2xDaGFpbk5hbWUuRGJnPVJlbW90ZSBYTCBDL0MrKyBUb29sIENoYWluCi0KLSMgR2VuZXJpYyBwbGF0Zm9ybSBuYW1lcwotUGxhdGZvcm1OYW1lLlJlbD1SZWxlYXNlIFBsYXRmb3JtCi1QbGF0Zm9ybU5hbWUuRGJnPURlYnVnIFBsYXRmb3JtCi0KLSMgR2VuZXJpYyBidWlsZGVyIG5hbWVzCi1CdWlsZGVyTmFtZS5SZWw9R05VIE1ha2UKLUJ1aWxkZXJOYW1lLkRiZz1HTlUgTWFrZQotCi0jIFRvb2wgbmFtZXMKLVRvb2xOYW1lLmNvbXBpbGVyLnhsYy5jID0gUmVtb3RlIFhMIEMgQ29tcGlsZXIKLVRvb2xOYW1lLmNvbXBpbGVyLnhsYy5jcHAgPSBSZW1vdGUgWEwgQysrIENvbXBpbGVyCi1Ub29sTmFtZS5saW5rZXIueGxjLmMgPSBSZW1vdGUgWEwgQyBFeGVjdXRhYmxlIExpbmtlcgotVG9vbE5hbWUubGlua2VyLnhsYy5jcHAgPSBSZW1vdGUgWEwgQysrIEV4ZWN1dGFibGUgTGlua2VyCi1Ub29sTmFtZS5hcmNoaXZlci54bGMgPSBBcmNoaXZlcgotVG9vbE5hbWUuYXNzZW1ibGVyLnhsYyA9IFhMIEFzc2VtYmxlcgotVG9vbE5hbWUubGlua2VyLnhsYy5jcHAuc28gPSBSZW1vdGUgWEwgQysrIFNoYXJlZCBPYmplY3QgTGlua2VyCi1Ub29sTmFtZS5saW5rZXIueGxjLmMuc28gPSBSZW1vdGUgWEwgQyBTaGFyZWQgT2JqZWN0IExpbmtlcgotCi0jIEdlbmVyaWMgQ2F0ZWdvcnkgTmFtZXMKLU9wdGlvbkNhdGVnb3J5LkxpbmtpbmcgPSBMaW5raW5nCi1PcHRpb25DYXRlZ29yeS5MaWJzID0gTGlicmFyaWVzIGFuZCBQYXRocwotT3B0aW9uQ2F0ZWdvcnkuaWZwID0gSW50ZWdlciBhbmQgRmxvYXRpbmcgUG9pbnQKLU9wdGlvbkNhdGVnb3J5LmNjID0gQ29tcGlsZXIgQ3VzdG9taXphdGlvbgotT3B0aW9uQ2F0ZWdvcnkubG0gPSBMaXN0aW5ncyBhbmQgTWVzc2FnZXMKLU9wdGlvbkNhdGVnb3J5LmVjZCA9IEVycm9yIENoZWNraW5nIGFuZCBEZWJ1Z2dpbmcKLU9wdGlvbkNhdGVnb3J5LklucHV0ID0gSW5wdXQgQ29udHJvbAotT3B0aW9uQ2F0ZWdvcnkuT3V0cHV0ID0gT3V0cHV0IENvbnRyb2wKLU9wdGlvbkNhdGVnb3J5Lk9wdGltaXplPU9wdGltaXphdGlvbgotT3B0aW9uQ2F0ZWdvcnkuQ29tcCA9IENvbXBhdGliaWxpdHkKLU9wdGlvbkNhdGVnb3J5Lk1pc2M9TWlzY2VsbGFuZW91cwotT3B0aW9uQ2F0ZWdvcnkuQXNzZW1ibGVyPUFzc2VtYmxlciBPcHRpb25zCi1PcHRpb25DYXRlZ29yeS5HZW5lcmFsPUdlbmVyYWwKLU9wdGlvbkNhdGVnb3J5Lm9iamNjPU9iamVjdCBjb2RlIGNvbnRyb2wKLQotCi0jIGdlbmVyaWMgbmFtZXMgdXNlZCBieSBtdWx0aXBsZSBvcHRpb25zCi1PcHRpb24ubm9uZSA9IG5vbmUKLU9wdGlvbi5kZWZhdWx0ID0gZGVmYXVsdAotCi0jIE1pc2NlbGxhbmVvdXMgb3B0aW9ucwotT3B0aW9uLmNvbXBpbGVyLm90aGVyID0gT3RoZXIgY29tcGlsZXIgZmxhZ3MKLQotIyBJbnB1dCBDb250cm9sIG9wdGlvbnMKLU9wdGlvbi5QcmVwcm9jY29tbWVudHMgPSBQcmVzZXJ2ZSBjb21tZW50cyBpbiBwcmUtcHJvY2Vzc2VkIG91dHB1dCAoLUMpCi1PcHRpb24uRGVmU3ltID0gRGVmaW5lIGEgbWFjcm8gbmFtZSAoLUQpCi1PcHRpb24uSW5jbFBhdGhzID0gU3BlY2lmeSBhbiBhZGRpdGlvbmFsIHNlYXJjaCBwYXRoIGZvciAjaW5jbHVkZSBzICgtSSkKLU9wdGlvbi5VbmRlZlN5bSA9IFVuZGVmaW5lIGEgbWFjcm8gbmFtZSAoLVUpCi1PcHRpb24uYWx0aXZlYyA9IEVuYWJsZSBjb21waWxlciBzdXBwb3J0IGZvciB2ZWN0b3IgZGF0YSB0eXBlcyAoLXFhbHRpdmVjKQotT3B0aW9uLmFzbSA9IENvbnRyb2wgdGhlIGludGVycHJldGF0aW9uIG9mIGFuZCBzdWJzZXF1ZW50IGdlbmVyYXRpb24gb2YgY29kZSBmb3IgYXNtIHN0YXRlbWVudCAoLXFhc20pCi1PcHRpb24uYXNtLmRlZmF1bHQgPSBEZWZhdWx0Ci1PcHRpb24uYXNtLnN0ZGNwcCA9IFN0YW5kYXJkICgtcWFzbT1zdGRjcHApCi1PcHRpb24uYXNtLmdjYyA9IEdDQyAoLXFhc209Z2NjKQotT3B0aW9uLkNzdGRpbmMgPSBTcGVjaWZ5IEMgc3RhbmRhcmQgc2VhcmNoIGxvY2F0aW9uICgtcWNfc3RkaW5jKQotT3B0aW9uLmNwcHN0ZGluYyA9IFNwZWNpZnkgQysrIHN0YW5kYXJkIHNlYXJjaCBsb2NhdGlvbiAoLXFjcHBfc3RkaW5jKQotT3B0aW9uLnFjb21wbGV4Z2NjaW5jbCA9IFdyYXAgaW5jbHVkZSBmaWxlcyBpbiBHQ0MgcHJhZ21hcyAoLXFjb21wbGV4Z2NjaW5jbCkKLU9wdGlvbi5Ob2NwbHVzID0gRG9uJ3QgcmVjb2duaXplIEMrKyBjb21tZW50cyBpbiBDIHNvdXJjZSBmaWxlcygtcW5vY3BsdXNjbXQpCi1PcHRpb24uTWJjcyA9IEVuYWJsZSByZWNvZ25pdGlvbiBvZiBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgKC1xbWJjcykKLU9wdGlvbi5EaWdyYXBoID0gRW5hYmxlIHJlY29nbml0aW9uIG9mIGRpZ3JhcGggY2hhcmFjdGVycyAoLXFkaWdyYXBoKQotT3B0aW9uLkRvbGxhciA9IEFsbG93ICQgc3ltYm9scyB0byBiZSB1c2VkIGluIGlkZW50aWZpZXJzICgtcWRvbGxhcikKLU9wdGlvbi5JbmNkaXJmaXJzdCA9ICBDaGFuZ2UgdGhlIHNlYXJjaCBwYXRoICgtcWlkaXJmaXJzdCkKLU9wdGlvbi5pZ25wcmFnID0gSWdub3JlIGNlcnRhaW4gcHJhZ21hcyAoLXFpZ25wcmFnPSkKLU9wdGlvbi5pZ25wcmFnLmRpc2pvaW50ID0gZGlzam9pbnQKLU9wdGlvbi5pZ25wcmFnLmlzb2xhdGVkID0gaXNvbGF0ZWQKLU9wdGlvbi5pZ25wcmFnLmFsbCA9IGFsbAotT3B0aW9uLmlnbnByYWcuaWJtID0gSUJNKFIpCi1PcHRpb24uaWducHJhZy5vbXAgPSBvbXAKLU9wdGlvbi5LZXl3b3JkID0gVHJlYXQgc3BlY2lmaWVkIG5hbWUgYXMgYSBrZXl3b3JkKC1xa2V5d29yZCkKLU9wdGlvbi5sYW5nbHZsID0gTGFuZ3VhZ2UgbGV2ZWwgKC1xbGFuZ2x2bD0pCi1PcHRpb24ubGFuZ2x2bC5jbGFzc2ljID0gY2xhc3NpYwotT3B0aW9uLmxhbmdsdmwuZXh0ZW5kZWQgPSBleHRlbmRlZAotT3B0aW9uLmxhbmdsdmwuc2FhID0gU0FBCi1PcHRpb24ubGFuZ2x2bC5zYWFsMiA9IFNBQSBMZXZlbCAyCi1PcHRpb24ubGFuZ2x2bC5zdGRjODkgPSBDODkgc3RhbmRhcmQKLU9wdGlvbi5sYW5nbHZsLnN0ZGM5OSA9IEM5OSBzdGFuZGFyZAotT3B0aW9uLmxhbmdsdmwuZXh0Yzg5ID0gQzg5IHdpdGggZXh0ZW5zaW9ucwotT3B0aW9uLmxhbmdsdmwuZXh0Yzk5ID0gQzk5IHdpdGggZXh0ZW5zaW9ucwotT3B0aW9uLmxhbmdsdmwudWNzID0gVUNTCi1PcHRpb24uTWFjcHN0ciA9IENvbnZlcnQgcGFzY2FsIHN0cmluZyBsaXRlcmFscyBpbnRvIG51bGwtdGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbHMgKC1xbWFjcHN0cikKLU9wdGlvbi5QYXNjYWwgPSBSZWNvZ25pemUgYW5kIGFjY2VwdCB0aGUga2V5d29yZCBwYXNjYWwgKC1xcGFzY2FsKQotT3B0aW9uLnNvdXJjZXR5cGUgPSBPdmVycmlkZSBzb3VyY2UgdHlwZSAoLXFzb3VyY2V0eXBlKQotT3B0aW9uLnNvdXJjZXR5cGUuYyA9IGMKLU9wdGlvbi5zb3VyY2V0eXBlLmMrKyA9IEMrKwotT3B0aW9uLnNvdXJjZXR5cGUuYXNzZW1ibGVyID0gYXNzZW1ibGVyCi1PcHRpb24uc3RkZnJhbWV3b3JrID0gU2VhcmNoIHN0YW5kYXJkIGZyYW1ld29yayBkaXJlY3RvcmllcyAoLXFzdGRmcmFtZXdvcmspCi1PcHRpb24uZnJhbWV3b3JrZGlycyA9IFNwZWNpZnkgYWRkaXRpb25hbCBmcmFtZXdvcmsgZGlyZWN0b3JpZXMgKC1xZnJhbWV3b3JrZGlyKQotT3B0aW9uLklucHV0ID0gRG9uJ3Qgc2VhcmNoIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGRpcmVjdG9yaWVzICgtcW5vc3RkaW5jKQotT3B0aW9uLldhcm4uU3ludGF4ID1QZXJmb3JtIHN5bnRheCBjaGVja2luZyB3aXRob3V0IGdlbmVyYXRpbmcgYW4gb2JqZWN0IGZpbGUoLXFzeW50YXhvbmx5KSAKLU9wdGlvbi5UcmlncmFwaD1SZWNvZ25pemUgdHJpLWdyYXBoIGtleSBjb21iaW5hdGlvbnMKLU9wdGlvbi5VdGY9RW5hYmxlIHJlY29nbml0aW9uIG9mIFVURiBsaXRlcmFsIHN5bnRheCAoLXF1dGYpCi1PcHRpb24ucGx1cyA9IENvbXBpbGUgYW55IGZpbGUgYXMgYSBDKysgZmlsZSAoLSspCi1PcHRpb24uY2luYyA9IEluc2VydCBleHRlcm4gIkMiIHt9IGluIHRoZSBzcGVjaWZpZWQgaW5jbHVkZSBmaWxlcyAoLXFjaW5jKQotT3B0aW9uLmdjY19jX3N0ZGluYyA9IENoYW5nZSBHQ0MgaGVhZGVycyBzZWFyY2ggbG9jYXRpb24gKC1xZ2NjX2Nfc3RkaW5jKQotT3B0aW9uLmdjY19jcHBfc3RkaW5jID0gQ2hhbmdlIEcrKyBoZWFkZXJzIHNlYXJjaCBsb2NhdGlvbiAoLXFnY2NfY3BwX3N0ZGluYykKLQotIyBPdXRwdXQgQ29udHJvbCBvcHRpb25zCi0KLU9wdGlvbi5UcmFjZT1QcmV2aWV3IHRoZSBzdGVwcyBmb3IgY29tcGlsYXRpb24oLSMpCi1PcHRpb24uYm1heGRhdGE9TWF4aW11bSBzaXplIG9mIHRoZSBhcmVhIHNoYXJlZCBieSB0aGUgc3RhdGljIGRhdGEgYW5kIHRoZSBoZWFwICgtYm1heGRhdGE9KQotT3B0aW9uLmM9UGFzcyB0aGUgc291cmNlIGZpbGVzIHRocm91Z2ggY29tcGlsZXIgY29tcG9uZW50IG9ubHkoLWMpCi1PcHRpb24uUHJlcHJvY09ubHk9UHJlcHJvY2VzcyB0aGUgc291cmNlIGZpbGVzIGFuZCBjcmVhdGUgYW4gb3V0cHV0IHByZXByb2Nlc3NlZCBzb3VyY2UgZmlsZSAoLUUpCi1PcHRpb24uUHJlcHJvY1JlbW92ZUNvbW1lbnRzPVJlbW92ZSBjb21tZW50cyBmcm9tIHByZXByb2Nlc3NlZCBvdXRwdXQgKC1DISkKLU9wdGlvbi5NPUNyZWF0ZSBhbiBvdXRwdXQgZmlsZSB0aGF0IGNvbnRhaW5zIHRhcmdldHMgZm9yIHRoZSBtYWtlIGNvbW1hbmQgKC1NKQotT3B0aW9uLm1hPVN1YnN0aXR1dGUgaW5saW5lIGNvZGUgZm9yIGNhbGxzIHRvIGFsbG9jYSAoLW1hKQotT3B0aW9uLm89U3BlY2lmeSBhbiBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlciAoLW8pIAotT3B0aW9uLlA9UHJlcHJvY2VzcyB0aGUgc291cmNlIGZpbGVzIGFuZCBjcmVhdGUgYW4gb3V0cHV0IHByZXByb2Nlc3NlZCBzb3VyY2UgZmlsZSBmb3IgZWFjaCBzb3VyY2UgZmlsZSgtUCkKLU9wdGlvbi5Bc3NlbT1HZW5lcmF0ZSBhbiBhc3NlbWJsZXIgbGFuZ3VhZ2UgZmlsZSBmb3IgZWFjaCBzb3VyY2UgZmlsZSgtUykKLU9wdGlvbi5TdHJpcD1TdHJpcCBzeW1ib2wgdGFibGUsIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGFuZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gc291cmNlIGZpbGUoLXMpCi1PcHRpb24uNjQ9U2VsZWN0IDY0LWJpdCBjb21waWxlciBtb2RlKC1xNjQpCi1PcHRpb24uQWxpZ249U3BlY2lmeSB3aGF0IGFsaWdubWVudCBydWxlcyBjb21waWxlciB1c2VzIGZvciBjb21waWxhdGlvbigtcWFsaWduKQotT3B0aW9uLkFsaWduLkZ1bGw9ZnVsbAotT3B0aW9uLkFsaWduLk5hdHVyYWw9bmF0dXJhbAotT3B0aW9uLkFsaWduLnR3b2J5dGU9dHdvIGJ5dGUKLU9wdGlvbi5BbGlnbi5wYWNrZWQ9cGFja2VkCi1PcHRpb24uQWxpZ24uYml0cGFja2VkPWJpdCBwYWNrZWQKLU9wdGlvbi5hbGxvY2E9U3Vic3RpdHV0ZSBpbmxpbmUgY29kZSBmb3IgY2FsbHMgdG8gZnVuY3Rpb24gYWxsb2NhKC1xYWxsb2NhKQotT3B0aW9uLkJpdGZpZWxkcz1TcGVjaWZ5IGlmIGJpdCBmaWVsZHMgYXJlIHNpZ25lZCgtcWJpdGZpZWxkcykKLU9wdGlvbi5CaXRmaWVsZHMuc2lnbmVkID0gc2lnbmVkCi1PcHRpb24uQml0ZmllbGRzLnVuc2lnbmVkID0gdW5zaWduZWQKLU9wdGlvbi5DaGFycz1TcGVjaWZ5IGlmIGNoYXJzIGFyZSBzaWduZWQKLU9wdGlvbi5jaGFycy5zaWduZWQgPSBzaWduZWQgKC1xY2hhcnM9c2lnbmVkKQotT3B0aW9uLmNoYXJzLnVuc2lnbmVkID0gdW5zaWduZWQgKC1xY2hhcnNlPXVuc2lnbmVkKQotT3B0aW9uLmVuYWJsZXZteD1FbmFibGUgZ2VuZXJhdGlvbiBvZiBWTVggaW5zdHJ1Y3Rpb25zKC1xZW5hYmxldm14KQotT3B0aW9uLkVudW09U3BlY2lmeSB0aGUgYW1vdW50IG9mIHN0b3JhZ2Ugb2NjdXBpZWQgYnkgZW51bWVyYXRpb25zKC1xZW51bT0pCi1PcHRpb24uZW51bS5JbnQ9SW50Ci1PcHRpb24uZW51bS5JbnRsb25nPUludGxvbmcKLU9wdGlvbi5lbnVtLnNtYWxsPXNtYWxsCi1PcHRpb24uZW51bS4xPTEKLU9wdGlvbi5lbnVtLjI9MgotT3B0aW9uLmVudW0uND00Ci1PcHRpb24uZW51bS44PTgKLU9wdGlvbi5QaWM9R2VuZXJhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzdWl0YWJsZSBmb3IgdXNlIGluIGxpYnJhcmllcygtcXBpYz0pCi1PcHRpb24uUGljLlNtYWxsPVNtYWxsCi1PcHRpb24uUGljLkxhcmdlPUxhcmdlCi1PcHRpb24ubm9ybz1EbyBub3QgcGxhY2Ugc3RyaW5nIGxpdGVyYWxzIGluIHJlYWQgb25seSBzdG9yYWdlICgtcW5vcm8pCi1PcHRpb24ubm9yb2NvbnN0PURvIG5vdCBwbGFjZSBjb25zdGFudCB2YWx1ZXMgaW4gcmVhZCBvbmx5IHN0b3JhZ2UgKC1xbm9yb2NvbnN0KQotT3B0aW9uLnJvcHRyPVBsYWNlIGNvbnN0YW50IHBvaW50ZXJzIGluIHJlYWQgb25seSBzdG9yYWdlICgtcXJvcHRyKSAKLU9wdGlvbi5TdGF0c3ltPUdlbmVyYXRlIHN5bWJvbHMgZm9yIHN0YXRpYyB2YXJpYWJsZXMgKC1xc3RhdHN5bSApCi1PcHRpb24ueGNhbGw9R2VuZXJhdGUgY29kZSB0byB0cmVhdCBzdGF0aWMgZnVuY3Rpb25zIGFzIGV4dGVybmFsIGZ1bmN0aW9ucyAoLXF4Y2FsbCApCi1PcHRpb24uZnVuY3NldD1QbGFjZSBpbnN0cnVjdGlvbnMgZm9yIGVhY2ggZnVuY3Rpb24gaW4gYSBzZXBhcmF0ZSBvYmplY3QgZmlsZSBjb250cm9sIHNlY3Rpb24gb3IgY3NlY3QgKC1xZnVuY3NldCkKLU9wdGlvbi5wcGxpbmU9RW5hYmxlIGdlbmVyYXRpb24gb2YgI2xpbmUgZGlyZWN0aXZlIGluIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0ICgtcXBwbGluZSkKLU9wdGlvbi51cGNvbnY9UHJlc2VydmUgdGhlIHVuc2lnbmVkIHNwZWNpZmljYXRpb24gd2hlbiBwZXJmb3JtaW5nIGludGVncmFsIHByb21vdGlvbnMgKC1xdXBjb252KQotT3B0aW9uLm5hbWVtYW5nbGluZz1OYW1lIG1hbmdsaW5nIHNjaGVtZSBmb3IgZXh0ZXJuYWwgc3ltYm9sIG5hbWVzICgtcW5hbWVtYW5nbGluZz0pCi1PcHRpb24ubmFtZW1hbmdsaW5nLnYxMC5uYW1lPU5hbWUgbWFuZ2xpbmcgc2NoZW1lIGZvciBleHRlcm5hbCBzeW1ib2wgbmFtZXMgKC1xbmFtZW1hbmdsaW5nPSkKLU9wdGlvbi5uYW1lbWFuZ2xpbmcuYW5zaSA9IEFOU0kgKC1xbmFtZW1hbmdsaW5nPWFuc2kpCi1PcHRpb24ubmFtZW1hbmdsaW5nLnY2ID0gVmlzdWFsQWdlKFIpIEMrKyB2NiAoLXFuYW1lbWFuZ2xpbmc9djYpCi1PcHRpb24ubmFtZW1hbmdsaW5nLnY1ID0gVmlzdWFsQWdlKFIpIEMrKyB2NSAoLXFuYW1lbWFuZ2xpbmc9djUpCi1PcHRpb24ubmFtZW1hbmdsaW5nLnY0ID0gVmlzdWFsQWdlKFIpIEMrKyB2NCAoLXFuYW1lbWFuZ2xpbmc9djQpCi1PcHRpb24ubmFtZW1hbmdsaW5nLnYzID0gQ29tcGF0aWJpbGl0eSBtb2RlICgtcW5hbWVtYW5nbGluZz12MykKLU9wdGlvbi5uYW1lbWFuZ2xpbmcudjc9SUJNIFhMIEMvQysrIHY3ICgtcW5hbWVtYW5nbGluZz12NykKLU9wdGlvbi5uYW1lbWFuZ2xpbmcudjg9SUJNIFhMIEMvQysrIHY4ICgtcW5hbWVtYW5nbGluZz12OCkKLU9wdGlvbi5uYW1lbWFuZ2xpbmcudjk9SUJNIFhMIEMvQysrIHY5ICgtcW5hbWVtYW5nbGluZz12OSkKLU9wdGlvbi5uYW1lbWFuZ2xpbmcudjEwPUlCTSBYTCBDL0MrKyB2MTAgKC1xbmFtZW1hbmdsaW5nPXYxMCkKLU9wdGlvbi5vYmplY3Rtb2RlbCA9IE9iamVjdCBtb2RlbCAoLXFvYmptb2RlbD0pCi1PcHRpb24ub2JqZWN0bW9kZWwuY2xhc3NpYyA9IGNsYXNzaWMgKC1xb2JqbW9kZWw9Y2xhc3NpYykKLU9wdGlvbi5vYmplY3Rtb2RlbC5pYm0gPSBJQk0oUikgKC1xb2JqbW9kZWw9aWJtKQotT3B0aW9uLnJ0dGkgPSBHZW5lcmF0ZSBSdW5UaW1lIFR5cGUgSW5mb3JtYXRpb24gKC1xcnR0aSkKLU9wdGlvbi5ydHRpLmFsbCA9IGFsbCAoLXFycnRpPWFsbCkKLU9wdGlvbi5ydHRpLnR5cGUgPSB0eXBlICgtcXJ0dGk9dHlwZSkKLU9wdGlvbi5ydHRpLmR5bmFtaWNjYXN0ID0gZHluYW1pYyBjYXN0ICgtcXJ0dGk9ZHluYW1pY2Nhc3QpCi1PcHRpb24uc2F2ZW9wdCA9IFNhdmUgdGhlIGNvbW1hbmQgbGluZSBjb21waWxlciBvcHRpb25zIGludG8gYW4gb2JqZWN0IGZpbGUgICgtcXNhdmVvcHQpCi1PcHRpb24uc3RhdGljaW5saW5lID0gVHJlYXQgaW5saW5lIGZ1bmN0aW9ucyBhcyBzdGF0aWMgKC1xc3RhdGljaW5saW5lKQotT3B0aW9uLnN0YXRzeW0gPSBBZGQgc3RhdGljIHZhcmlhYmxlcyB0byB0aGUgc3ltYm9sIHRhYmxlICAoLXFzdGF0c3ltKQotT3B0aW9uLnRocmVhZGVkID0gRW5hYmxlIG11bHRpLXRocmVhZGVkIGV4ZWN1dGlvbiAoLXF0aHJlYWRlZCkKLU9wdGlvbi51bmlxdWUgPSBHZW5lcmF0ZSB1bmlxdWUgbmFtZXMgZm9yIHN0YXRpYyBjb25zdHJ1Y3Rvci9kZWNvbnN0cnVjdG9yIGZpbGUgY29tcGlsYXRpb24gdW5pdHMgKC1xdW5pcXVlKQotT3B0aW9uLnVuaXF1ZS52MTAgPSBHZW5lcmF0ZSB1bmlxdWUgbmFtZXMgZm9yIHN0YXRpYyBjb25zdHJ1Y3Rvci9kZWNvbnN0cnVjdG9yIGZpbGUgY29tcGlsYXRpb24gdW5pdHMgKC1xdW5pcXVlKQotT3B0aW9uLm5vdmZ0YWJsZSA9IERvIG5vdCBnZW5lcmF0ZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlICgtcW5vdmZ0YWJsZSkKLU9wdGlvbi52cnNhdmUgPSBNYWludGFpbiB0aGUgVlJTQVZFIHJlZ2lzdGVyICgtcXZyc2F2ZSkKLU9wdGlvbi53ZWFrc3ltYm9sID0gR2VuZXJhdGUgd2VhayBzeW1ib2xzICgtcXdlYWtzeW1ib2wpCi1PcHRpb24ubWFjcm9zPUVtaXQgbWFjcm8gZGVmaW5pdGlvbnMgdG8gcHJlcHJvY2Vzc2VkIG91dHB1dCAoLXFzaG93bWFjcm9zKQotT3B0aW9uLm1hY3Jvcy5hbGw9YWxsICgtcXNob3dtYWNyb3M9YWxsKQotT3B0aW9uLm1hY3Jvcy5wcmU9cHJlZGVmaW5lZCAoLXFzaG93bWFjcm9zPXByZSkKLU9wdGlvbi5tYWNyb3Mubm9wcmU9bm8gbWFjcm9zICgtcXNob3dtYWNyb3M9bm9wcmUpCi1PcHRpb25zLnRpbWVzdGFtcHM9U3VwcHJlc3MgaW5zZXJ0IG9mIGltcGxpY2l0IHRpbWVzdGFtcHMgaW50byBhbiBvYmplY3QgZmlsZSAoLXFub3RpbWVzdGFtcHMpCi0KLSMgT3B0aW1pemF0aW9uIG9wdGlvbnMKLU9wdGlvbi5PcHRMZXZlbCA9IE9wdGltaXphdGlvbiBsZXZlbAotT3B0aW9uLk9wdGltaXplLk9wdGltaXplID0gLU8KLU9wdGlvbi5PcHRpbWl6ZS5MZXZlbDIgPSAtTzIKLU9wdGlvbi5PcHRpbWl6ZS5MZXZlbDMgPSAtTzMKLU9wdGlvbi5PcHRpbWl6ZS5MZXZlbDQgPSAtTzQKLU9wdGlvbi5PcHRpbWl6ZS5MZXZlbDUgPSAtTzUKLU9wdGlvbi5pbmxpbmluZyA9IEZ1bmN0aW9uIGlubGluaW5nCi1PcHRpb24uaW5saW5pbmcuUSA9IGlubGluZSBhbGwgZnVuY3Rpb25zICgtUSkKLU9wdGlvbi5pbmxpbmluZy5RZXhjbGFtYXRpb24gPSBkaXNhYmxlIGlubGluaW5nICgtUSEpCi1PcHRpb24uUXBsdXMgPSBTcGVjaWZ5IGZ1bmN0aW9ucyB0byBiZSBpbmxpbmVkKC1RK25hbWUxOm5hbWUyOi4uLjpuYW1lTikKLU9wdGlvbi5RbWludXMgPSBTcGVjaWZ5IGZ1bmN0aW9ucyB0byBub3QgaW5saW5lICgtUS1uYW1lMTpuYW1lMjouLi46bmFtZU4pCi1PcHRpb24uYWdncmNvcHkgPSBFbmFibGUgZGVzdHJ1Y3RpdmUgY29weSBvcGVyYXRpb25zIGZvciBzdHJ1Y3RzIGFuZCB1bmlvbnMKLU9wdGlvbi5hZ2dyY29weS5ub292ZXJsYXA9bm8gb3ZlcmxhcCAoLXFhZ2dyY29weT1ub292ZXJsYXApCi1PcHRpb24uYWdncmNvcHkub3ZlcmxhcD1vdmVybGFwICgtcWFnZ3Jjb3B5PW92ZXJsYXApCi1PcHRpb24uYWxpYXM9IEFwcGx5IGFsaWFzaW5nIGluc3RydWN0aW9ucyB0byBjb21waWxhdGlvbiB1bml0ICgtcWFsaWFzPSkKLU9wdGlvbi5hbGlhcy5hZGRydGFrZW49IFZhcmlhYmxlcyBhcmUgbm90IGRpc2pvaW50IGZyb20gcG9pbnRlcnMgKC1xYWxpYXM9YWRkcnRha2VuKQotT3B0aW9uLmFsaWFzLm5vYWRkcnRha2VuPVZhcmlhYmxlcyBhcmUgZGlzam9pbnQgZnJvbSBwb2ludGVycyB1bmxlc3MgdGhlaXIgYWRkcmVzcyBpcyB0YWtlbiAoLXFhbGlhcz1ub3RhZGRydGFrZW4pCi1PcHRpb24uYWxpYXMuYWxscHRycz1Qb2ludGVycyBhcmUgYWxpYXNlZCAoLXFhbGlhcz1hbGxwdHJzKQotT3B0aW9uLmFsaWFzLm5vYWxscHRycz1Qb2ludGVycyBhcmUgbmV2ZXIgYWxpYXNlZCAoLXFhbGlhcz1ub2FsbHB0cnMpCi1PcHRpb24uYWxpYXMuYW5zaT1Qb2ludGVycyBjYW4gb25seSBwb2ludCB0byBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZSAoLXFhbGlhcz1hbnNpKQotT3B0aW9uLmFsaWFzLm5vYW5zaT1Qb2ludGVycyBjYW4gcG9pbnQgdG8gYW4gb2JqZWN0IG9mIGEgZGlmZmVyZW50IHR5cGUgKC1xYWxpYXM9bm90YW5zaSkKLU9wdGlvbi5hbGlhcy50eXBlcHRyPVBvaW50ZXJzIHRvIGRpZmZlcmVudCB0eXBlcyBhcmUgYWxpYXNlZCAoLXFhbGlhcz10eXBlcHRyKQotT3B0aW9uLmFsaWFzLm5vdHlwZXB0cj1Qb2ludGVycyB0byBkaWZmZXJlbnQgdHlwZXMgYXJlIG5ldmVyIGFsaWFzZWQgKC1xYWxpYXM9bm90eXBlcHRyKQotT3B0aW9uLm9wdGltaXphdGlvbi5hcmNoID0gU3BlY2lmeSB0aGUgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSB0byBnZW5lcmF0ZSBjb2RlIGFuZCBvcHRpbWl6ZSBmb3IgKC1xYXJjaD0pCi1PcHRpb24ub3B0aW1pemF0aW9uLmFyY2gucHBjNjQgPSBQb3dlclBDKFIpIDY0LWJpdAotT3B0aW9uLm9wdGltaXphdGlvbi5hcmNoLnBwY2dyID0gUG93ZXJQQyhSKSB3aXRoIGdyYXBoaWNzIGluc3RydWN0aW9ucwotT3B0aW9uLm9wdGltaXphdGlvbi5hcmNoLnBwYzY0Z3IgPSBQb3dlclBDKFIpIDY0LWJpdCB3aXRoIGdyYXBoaWNzIGluc3RydWN0aW9ucwotT3B0aW9uLm9wdGltaXphdGlvbi5hcmNoLnBwYzY0Z3JzcSA9IFBvd2VyUEMoUikgNjQtYml0IHdpdGggZ3JhcGhpY3MgYW5kIHNxdWFyZSByb290IGluc3RydWN0aW9ucwotT3B0aW9uLm9wdGltaXphdGlvbi5hcmNoLnBwYzY0diA9IFBvd2VyUEMoUikgNjQtYml0IHdpdGggQWx0aVZlYwotT3B0aW9uLm9wdGltaXphdGlvbi50dW5lID0gU3BlY2lmeSB0aGUgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSB0byB0dW5lIGNvZGUgZm9yICgtcXR1bmU9KQotT3B0aW9uLm9wdGltaXphdGlvbi50dW5lLmF1dG8gPSBhdXRvCi1PcHRpb24ub3B0aW1pemF0aW9uLmFzc2VydCA9IEFzc2VydCBwcm9ncmFtIGJlaGF2aW91cnMgKC1xYXNzZXJ0PSkKLU9wdGlvbi5vcHRpbWl6YXRpb24uQ2FjaGUgPSBTcGVjaWZ5IHRoZSBjYWNoZSBjb25maWd1cmF0aW9uICgtcWNhY2hlPW9wdGlvbjE6b3B0aW9uMjouLi46b3B0aW9uTikKLU9wdGlvbi5jb21wYWN0ID0gQXZvaWQgdHJhbnNmb3JtYXRpb25zIHRoYXQgbGVhZCB0byBjb2RlIGV4cGFuc2lvbiAoLXFjb21wYWN0KQotT3B0aW9uLm9wdGltaXphdGlvbi5kYXRhaW1wb3J0ZWQgPSBOYW1lIHRoZSB2YXJpYWJsZXMgdG8gYmUgaW1wb3J0ZWQgKC1xZGF0YWltcG9ydGVkPW5hbWUxOm5hbWUyOi4uLjpuYW1lTikKLU9wdGlvbi5vcHRpbWl6YXRpb24uZGF0YWxvY2FsID0gTmFtZSB0aGUgdmFyaWFibGVzIHdoaWNoIGFyZSBsb2NhbCAoLXFkYXRhbG9jYWw9bmFtZTE6bmFtZTI6Li4uOm5hbWVOKQotT3B0aW9uLmRpcmVjdHN0b3JhZ2UgPSBXcml0ZS10aHJvdWdoIGVuYWJsZWQgb3IgY2FjaGUtaW5oaWJpdGVkIHN0b3JhZ2UgbWF5IGJlIHJlZmVyZW5jZWQgKC1xZGlyZWN0c3RvcmFnZSkKLU9wdGlvbi5vcHRpbWl6YXRpb24uZXhjZXB0aW9uaGFuZGxpbmcgPSBFeGNlcHRpb24gaGFuZGxpbmcKLU9wdGlvbi5vcHRpbWl6YXRpb24uZXhjZXB0aW9uaGFuZGxpbmcuZWggPSBFbmFibGUgZXhjZXB0aW9uIGhhbmRsaW5nICgtcWVoKQotT3B0aW9uLm9wdGltaXphdGlvbi5leGNlcHRpb25oYW5kbGluZy5ub2VoID0gRGlzYWJsZSBleGNlcHRpb24gaGFuZGxpbmcgKC1xbm9laCkKLU9wdGlvbi5vcHRpbWl6YXRpb24uZXhjZXB0aW9uaGFuZGxpbmcudjUgPSBWaXN1YWxBZ2UoUikgQysrIHY1LjAgY29tcGF0aWJpbGl0eQotT3B0aW9uLm9wdGltaXphdGlvbi5leGNlcHRpb25oYW5kbGluZy52NiA9IFZpc3VhbEFnZShSKSBDKysgdjYuMCBjb21wYXRpYmlsaXR5Ci1PcHRpb24uZmRwciA9IEluY2x1ZGUgZGF0YSByZXF1aXJlZCBieSBmZHByIHV0aWxpdHkgKC1xZmRwcikKLU9wdGlvbi5vcHRpbWl6YXRpb24uaG90ID0gUGVyZm9ybSBoaWdoLW9yZGVyIGxvb3AgYW5hbHlzaXMgYW5kIHRyYW5zZm9ybWF0aW9ucyBkdXJpbmcgb3B0aW1pemF0aW9uICgtcWhvdD0pCi1PcHRpb24uaWduZXJybm8gPSBQZXJmb3JtIG9wdGltaXphdGlvbnMgd2hpY2ggYXNzdW1lIGVycm5vIGlzIG5vdCBtb2RpZmllZCBieSBzeXN0ZW0gY2FsbHMgKC1xaWduZXJybm8pCi1PcHRpb24ub3B0aW1pemF0aW9uLmlubGluZSA9IEF0dGVtcHQgdG8gaW5saW5lIGZ1bmN0aW9ucyAoLXFpbmxpbmU9KQotT3B0aW9uLm9wdGltaXphdGlvbi5pcGEgPSBDdXN0b21pemUgaW50ZXJwcm9jZWR1cmFsIGFuYWx5c2lzIG9wdGltaXphdGlvbnMoLXFpcGE9KQotT3B0aW9uLm9wdGltaXphdGlvbi5pc29sYXRlZGNhbGwgPSBGdW5jdGlvbnMgaW4gc291cmNlIGZpbGUgdGhhdCBoYXZlIG5vIHNpZGUgZWZmZWN0cyAoLXFpc29sYXRlZF9jYWxsPW5hbWUxOm5hbWUyOi4uLjpuYW1lTikKLU9wdGlvbi5vcHRpbWl6YXRpb24ua2VlcGlubGluZXMgPSAKLU9wdGlvbi5sYXJnZXBhZ2UgPSBFeHBsb2l0IGxhcmdlIHBhZ2UgaGVhcHMgYXZhaWxhYmxlIG9uIFBPV0VSNChUTSkgc3lzdGVtcyBydW5uaW5nIEFJWChSKSA1LjFEIG9yIGxhdGVyICgtcWxhcmdlcGFnZSkKLU9wdGlvbi5saWJhbnNpID0gQXNzdW1lIGFsbCBmdW5jdGlvbnMgaW4gdGhlIG5hbWUgb2YgYW5zaSBDIGZ1bmN0aW9uIGFyZSBzeXN0ZW0gZnVuY3Rpb25zICgtcWxpYmFuc2kpCi1PcHRpb24ucGRmMSA9IFR1bmUgb3B0aW1pemF0aW9ucyB0aHJvdWdoIFByb2ZpbGUgRGlyZWN0ZWQgRmVlZGJhY2s6IGZpcnN0IHJ1biAoLXFwZGYxKQotT3B0aW9uLnBkZjIgPSBUdW5lIG9wdGltaXphdGlvbnMgdGhyb3VnaCBQcm9maWxlIERpcmVjdGVkIEZlZWRiYWNrOiBzZWNvbmQgcnVuICgtcXBkZjIpCi1PcHRpb24ub3B0aW1pemF0aW9uLlByZWZldGNoID0gRGlzYWJsZSBnZW5lcmF0aW9uIG9mIHByZWZldGNoaW5nIGluc3RydWN0aW9ucyBpbiBjb21waWxlZCBjb2RlICgtcW5vcHJlZmV0Y2gpCi1PcHRpb24ub3B0aW1pemF0aW9uLnByb2NpbXBvcnRlZCA9IE1hcmsgZnVuY3Rpb25zIGFzIGltcG9ydGVkICgtcXByb2NpbXBvcnRlZD0pCi1PcHRpb24ub3B0aW1pemF0aW9uLnByb2Nsb2NhbCA9IE1hcmsgZnVuY3Rpb25zIGFzIGxvY2FsICgtcWxvY2FsPSkKLU9wdGlvbi5vcHRpbWl6YXRpb24ucHJvY2ltcG9ydGVkID0gTWFyayBmdW5jdGlvbnMgYXMgaW1wb3J0ZWQgKC1xcHJvY2ltcG9ydGVkPSkKLU9wdGlvbi5vcHRpbWl6YXRpb24ucHJvY3Vua25vd24gPSBNYXJrIGZ1bmN0aW9ucyBhcyB1bmtub3duICgtcXByb2N1bmtub3duPSkKLU9wdGlvbi5vcHRpbWl6YXRpb24uc2hvd3BkZiA9IEFkZCBhZGRpdGlvbmFsIGNhbGwgYW5kIGJsb2NrIGNvdW50IHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgZXhlY3V0YWJsZSAoLXFzaG93cGRmKQotT3B0aW9uLm9wdGltaXphdGlvbi5zbWFsbHN0YWNrID0gUmVkdWNlIHRoZSBzaXplIG9mIHRoZSBzdGFjayBmcmFtZSAoLXFzbWFsbHN0YWNrKQotT3B0aW9uLm9wdGltaXphdGlvbi5zbXAgPSBFbmFibGUgcGFyYWxsZWxpemF0aW9uIG9mIGNvZGUgKC1xc21wKQotT3B0aW9uLm9wdGltaXphdGlvbi5zbXAudjEwID0gU3BlY2lmeSBwYXJhbGxlbGl6YXRpb24gb2YgY29kZSAoLXFzbXA9bmFtZTE6bmFtZTI6Li4uOm5hbWVOKQotT3B0aW9uLm9wdGltaXphdGlvbi5zbXAudjEwLnRvb2x0aXA9UG9zc2libGUgdmFsdWVzOiBub3N0YWNrY2hlY2ssIG9wdCwgbm9yZWNfbG9ja3MsIG5vb21wLCBub25lc3RlZF9wYXIsIFxuZXhwbGljaXQsIGF1dG8sIG9tcCwgbmVzdGVkX3Bhciwgbm9hdXRvLCBub2V4cGxpY2l0LCBub29wdCwgcmVjX2xvY2tzLCBcbnNjaGVkdWxlPShydW50aW1lIHwgYXV0byB8IGFmZmluaXR5PW4gfCBkeW5hbWljPW4gfCBndWlkZWQ9biB8IHN0YXRpYz1uKSwgc3RhY2tjaGVjaywgdGhyZXNob2xkPW4KLU9wdGlvbi5vcHRpbWl6YXRpb24uU3BpbGwgPSBTcGVjaWZ5IHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIHNwaWxsIGFyZWEgKC1xc3BpbGw9KQotT3B0aW9uLm9wdGltaXphdGlvbi5TdHJpY3Q9VHVybiBvZmYgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb25zICgtcXN0cmljdCkKLU9wdGlvbi5vcHRpbWl6YXRpb24uU3RyaWN0LnYxMCA9IFNwZWNpZnkgdGhlIG9wdGltaXphdGlvbnMgKC1xc3RyaWN0PW5hbWUxOm5hbWUyOi4uLjpuYW1lTikKLU9wdGlvbi5vcHRpbWl6YXRpb24uU3RyaWN0LnYxMC50b29sdGlwPVBvc3NpYmxlIHZhbHVlczogYWxsLCBub25lLCBwcmVjaXNpb24sIG5vcHJlY2lzaW9uLCBleGNlcHRpb25zLCBub2V4Y2VwdGlvbnMsIFxuaWVlZWZwLCBub2llZWVmcCwgbmFucywgbm9uYW5zLCBpbmZpbml0aWVzLCBub2luZmluaXRpZXMsIHN1Ym5vcm1hbHMsIG5vc3Vibm9ybWFscywgXG56ZXJvc2lnbnMsIG5vemVyb3NpZ25zLCBvcGVyYXRpb25wcmVjaXNpb24sIG5vb3BlcmF0aW9ucHJlY2lzaW9uLCBvcmRlciwgbm9vcmRlciwgXG5hc3NvY2lhdGlvbiwgbm9hc3NvY2lhdGlvbiwgcmVkdWN0aW9ub3JkZXIsIG5vcmVkdWN0aW9ub3JkZXIsIGd1YXJkcywgbm9ndWFyZHMsIGxpYnJhcnksIG5vbGlicmFyeQotT3B0aW9uLm9wdGltaXphdGlvbi5sb29waW5kdWN0aW9uID0gTG9vcCBpbmR1Y3Rpb24gc2V0dGluZ3MKLU9wdGlvbi5vcHRpbWl6YXRpb24uc3RyaWN0X2luZHVjdGlvbiA9IFN0cmljdCBpbmR1Y3Rpb24KLU9wdGlvbi5vcHRpbWl6YXRpb24ubm9zdHJpY3RfaW5kdWN0aW9uID0gTm8gaW5kdWN0aW9uCi1PcHRpb24ub3B0aW1pemF0aW9uLnRvY2RhdGEgPSBNYXJrIGRhdGEgYXMgbG9jYWwKLU9wdGlvbi5vcHRpbWl6YXRpb24udyA9IFNwZWNpZnkgb3B0aW9ucyB0byBwYXNzIHRvIHNwZWNpZmljIGNvbXBpbGVyIGNvbXBvbmVudHMgICgtVykKLQotIyBMaW5rZXIgT3B0aW9ucwotT3B0aW9uLkxpbmtpbmcuYiA9IENvbnRyb2wgaG93IHNoYXJlZCBvYmplY3RzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGVkaXRvciAoLWIpCi1PcHRpb24ubGlua2luZy5icnRsID0gRW5hYmxlIHJ1bnRpbWUgbGlua2luZyBmb3IgdGhlIG91dHB1dCBmaWxlICgtYnJ0bCkKLU9wdGlvbi5saW5raW5nLmJ1bmRsZSA9IAotT3B0aW9uLkxpbmtpbmcuYnVuZGxlX2xvYWRlcgotT3B0aW9uLkxpbmtpbmcuZSA9IFNldCB0aGUgZW50cnkgbmFtZSBmb3IgdGhlIHNoYXJlZCBleGVjdXRhYmxlKC1lICkKLU9wdGlvbi5MaW5raW5nLmYgPSAKLU9wdGlvbi5saW5raW5nLkcgPSBDcmVhdGUgYSBzaGFyZWQgb2JqZWN0IGVuYWJsZWQgZm9yIHJ1bnRpbWUgbGlua2luZyAoLUcpCi1PcHRpb24uTGlua2luZy5MID0gU2VhcmNoIHRoZSBwYXRoIGRpcmVjdG9yeSBmb3IgdGhlIGxpYnJhcnkgZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSAtbGtleSBvcHRpb24gKC1MKQotT3B0aW9uLkxpbmtpbmcubCA9IFNlYXJjaCB0aGUgc3BlY2lmaWVkIGxpYnJhcnkgZmlsZSgtbCkKLU9wdGlvbi5saW5raW5nLnIgPSBQcm9kdWNlIGEgcmVsb2NhdGFibGUgb2JqZWN0ICgtcikKLU9wdGlvbi5MaW5raW5nLlogPSBTcGVjaWZ5IGEgcHJlZml4IGZvciBsaWJyYXJ5IHNlYXJjaCBwYXRoICgtWikKLU9wdGlvbi5saW5raW5nLmlubGdsdWUgPSBHZW5lcmF0ZSBmYXN0IGV4dGVybmFsIGxpbmthZ2UgKC1xaW5sZ2x1ZSkKLU9wdGlvbi5saW5raW5nLmxpYiA9IExpbmsgd2l0aCBzdGFuZGFyZCBzeXN0ZW0gbGlicmFyaWVzICgtcWxpYikKLU9wdGlvbi5MaW5raW5nLm1rc2hyb2JqID0gQ3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmcm9tIGdlbmVyYXRlZCBvYmplY3QgZmlsZXMgKC1xbWtzaHJvYmopCi1PcHRpb24uTGlua2luZy5wcmlvcml0eSA9IFNwZWNpZnkgdGhlIHByaW9yaXR5IGxldmVsIGZvciBpbml0aWFsaXphdGlvbiBvZiBzdGF0aWMgb2JqZWN0cyAoLXFwcmlvcml0eSkKLU9wdGlvbi5MaW5rZXIuRW5hYmxlUnVuPUVuYWJsZSBSdW4gdGltZSBsaW5raW5nICgtYnJ0bCkKLU9wdGlvbi5MaW5rZXIuTm9TdGFydEZpbGVzPURvIG5vdCB1c2Ugc3RhbmRhcmQgc3RhcnQgZmlsZXMgKC1ub3N0YXJ0ZmlsZXMpCi1PcHRpb24uTGlua2VyLk5vRGVmTGlicz1EbyBub3QgdXNlIGRlZmF1bHQgbGlicmFyaWVzICgtbm9kZWZhdWx0bGlicykKLU9wdGlvbi5MaW5rZXIuTm9TdGRMaWJzPU5vIHN0YXJ0dXAgb3IgZGVmYXVsdCBsaWJzICgtbm9zdGRsaWIpCi1PcHRpb24uTGlua2VyLlN0cmlwPVN0cmlwIGFsbCBzeW1ib2wgaW5mb3JtYXRpb24gKC1zKQotT3B0aW9uLkxpbmtlci5TdHJpcC5kZWJ1Zz1TdHJpcCBkZWJ1ZyBzeW1ib2wgaW5mb3JtYXRpb24gKC1TKQotT3B0aW9uLkxpbmtlci5TdGF0aWM9Tm8gc2hhcmVkIGxpYnJhcmllcyAoLWJzdGF0aWMpCi1PcHRpb24uTGlua2VyLldMaW5rZXI9T3RoZXIgb3B0aW9ucyAoLVdsLCBbb3B0aW9uMSxvcHRpb24yLC4uLm9wdGlvbk5dKQotT3B0aW9uLkxpbmtlci5GbGFncz1PdGhlciBsaW5rZXIgZmxhZ3MKLU9wdGlvbi5MaWJzPUxpYnJhcmllcyAoLWwpCi1PcHRpb24uTGlic2VhcmNoPUxpYnJhcnkgc2VhcmNoIHBhdGggKC1MKQotT3B0aW9uLlVzZXJPYmpzPU90aGVyIG9iamVjdHMKLU9wdGlvbi5MaW5rZXIuU2hhcmVkPVNoYXJlZCAoLXFta3Nocm9iaikKLU9wdGlvbi5MaW5rZXIuU09OYW1lPVNoYXJlZCBvYmplY3QgbmFtZSAoLW89KQotT3B0aW9uLkxpbmtlci5JbXBsaWI9SW1wb3J0IExpYnJhcnkgbmFtZSAoLVdsLC0tb3V0LWltcGxpYj0pCi1PcHRpb24uTGlua2VyLkRlZm5hbWU9REVGIGZpbGUgbmFtZSAoLVdsLC0tb3V0cHV0LWRlZj0pCi1PcHRpb24ubGlua2luZy5idW5kbGUgPSBDcmVhdGUgYSBidW5kbGUgKC1idW5kbGUpCi1PcHRpb24ubGlua2luZy5idW5kbGVfbG9hZGVyID0gU3BlY2lmeSB0aGUgbmFtZSBvZiBidW5kbGUgbG9hZGVyIHByb2dyYW0gKC1idW5kbGVfbG9hZGVyPSkKLU9wdGlvbi5saW5raW5nLmYgPSBTcGVjaWZ5IGZpbGUgY29udGFpbmluZyBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvciB0aGUgY29tcGlsZXIgdG8gcGFzcyB0byB0aGUgbGlua2VyICgtZikKLU9wdGlvbi5saW5raW5nLmV4cGZpbGUgPSBTYXZlIGFsbCB0aGUgZXhwb3J0ZWQgc3ltYm9scyBpbiB0aGUgZGVzaWduYXRlZCBmaWxlICgtcWV4cGZpbGU9KQotCi0jQXJjaGl2ZXIgb3B0aW9ucwotT3B0aW9uLkFyY2hpdmVyLkZsYWdzPU90aGVyIGFyY2hpdmVyIGZsYWdzCi0KLSMgSW50ZWdlciBhbmQgRmxvYXRpbmcgUG9pbnQgb3B0aW9ucwotT3B0aW9uLnkgPSBTcGVjaWZ5IGNvbXBpbGUgdGltZSByb3VuZGluZyBtb2RlICgteSkKLU9wdGlvbi55Lm4gPSBuCi1PcHRpb24ueS5tID0gbQotT3B0aW9uLnkucCA9IHAKLU9wdGlvbi55LnogPSB6Ci1PcHRpb24uZmxvYXQgPSBTcGVjaWZ5IGZsb2F0aW5nIHBvaW50IG9wdGlvbnMgKC1xZmxvYXQ9KQotT3B0aW9uLmZsdHRyYXAgPSBUcmFwIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMgKC1xZmx0dHJhcD0pCi1PcHRpb24ubG9uZ2xvbmcgPSBBbGxvdyBsb25nIGxvbmcgaW50ZWdlciB0eXBlcyBpbiB0aGUgcHJvZ3JhbQotT3B0aW9uLmxvbmdsb25nLmxvbmdsb25nID0gQWxsb3cgbG9uZyBsb25nICgtcWxvbmdsb25nKQotT3B0aW9uLmxvbmdsb25nLm5vbG9uZ2xvbmcgPSBEbyBub3QgYWxsb3cgbG9uZyBsb25nICgtcW5vbG9uZ2xvbmcpCi1PcHRpb24ucm5kZmx0ID0gQ29udHJvbCBjb21waWxlLXRpbWUgcm91bmRpbmcgbW9kZSBvZiBmbG9hdGluZyBwb2ludCBleHByZXNzaW9ucyggLXFybmRmbHQpCi1PcHRpb24ucm5kZmx0Lm5lYXJlc3QgPSBOZWFyZXN0Ci1PcHRpb24ucm5kZmx0Lm1pbnVzaW5mID0gTWludXMgaW5maW5pdHkKLU9wdGlvbi5ybmRmbHQucGx1c2luZiA9IFBsdXMgaW5maW5pdHkKLU9wdGlvbi5ybmRmbHQuemVybyA9IFplcm8KLU9wdGlvbi5kZnAgPSBEZWNpbWFsIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQgZm9yIHR5cGVzIGFuZCBsaXRlcmFscwotT3B0aW9uLmRmcC5lbmFibGVkID0gRW5hYmxlZCAoLXFkZnApCi1PcHRpb24uZGZwLmRpc2FibGVkID0gRGlzYWJsZWQgKC1xbm9kZnApCi0KLSMgQ29tcGlsZXIgQ3VzdG9taXphdGlvbiBvcHRpb25zCi1PcHRpb24uQiA9IERldGVybWluZSBzdWJzdGl0dXRlIHByb2dyYW0gcGF0aCBuYW1lICgtQikKLU9wdGlvbi5GID0gU3BlY2lmeSBhbHRlcm5hdGUgY29uZmlndXJhdGlvbiBmaWxlICgtRikKLU9wdGlvbi50ID0gQWRkIHByZWZpeCB0byBkZXNpZ25hdGVkIHByb2dyYW1zICgtdCkKLU9wdGlvbi5tYXhtZW0gPSBBbW91bnQgb2YgbWVtb3J5IHVzZWQgZHVyaW5nIG9wdGltaXphdGlvbiAoLXFtYXhtZW09KQotT3B0aW9uLnBhdGggPSBBbHRlcm5hdGUgcHJvZ3JhbSBuYW1lIGZvciBjb21waWxlciBjb21wb25lbnRzICgtcXBhdGg9KQotT3B0aW9uLnRscyA9IFNwZWNpZnkgdGhlIHRocmVhZCBsb2NhbCBzdG9yYWdlIG1vZGVsICgtcXRscz0pCi1PcHRpb24udGxzLnVuc3VwcG9ydGVkPXVuc3VwcG9ydGVkCi1PcHRpb24udGxzLmRlZmF1bHQ9ZGVmYXVsdAotT3B0aW9uLnRscy5nbG9iYWwtZHluYW1pYz1nbG9iYWwtZHluYW1pYwotT3B0aW9uLnRscy5pbml0aWFsLWV4ZWM9aW5pdGlhbC1leGVjCi1PcHRpb24udGxzLmxvY2FsLWR5bmFtaWM9bG9jYWwtZHluYW1pYwotT3B0aW9uLnRscy5sb2NhbC1leGVjPWxvY2FsLWV4ZWMKLU9wdGlvbi50bHMubm90bHM9Tm8gdGxzCi0KLSMgTGlzdGluZ3MgYW5kIE1lc3NhZ2VzIG9wdGlvbnMKLU9wdGlvbi5WID0gUmVwb3J0IGluZm9ybWF0aW9uIG9uIHRoZSBwcm9ncmVzcyBvZiBjb21waWxhdGlvbiAoLVYpCi1PcHRpb24uV2Fybi5ub3dhcm4gPSBTdXBwcmVzcyB3YXJuaW5ncyBhbmQgbG93LWxldmVsIG1lc3NhZ2VzICgtdykKLU9wdGlvbi5XYXJuLlBlZGFuZGljPVBlZGFudGljICgtcGVkYW50aWMpCi1PcHRpb24uV2Fybi5QZWRFcnJvcnM9UGVkYW50aWMgd2FybmluZ3MgYXMgZXJyb3JzICgtcGVkYW50aWMtZXJyb3JzKQotT3B0aW9uLldhcm4ubm93YXJuPUluaGliaXQgYWxsIHdhcm5pbmdzICgtdykKLU9wdGlvbi5XYXJuLmFsbHdhcm49QWxsIHdhcm5pbmdzICgtV2FsbCkKLU9wdGlvbi5XYXJuLnRvZXJycz1XYXJuaW5ncyBhcyBlcnJvcnMgKC1XZXJyb3IpCi1PcHRpb24uYXR0ciA9IFByb2R1Y2UgYSBjb21waWxlciBsaXN0aW5nICgtcWF0dHIpCi1PcHRpb24uYXR0ci5ub2F0dHIgPSBEb2VzIG5vdCBwcm9kdWNlIGFuIGF0dHJpYnV0ZSBsaXN0aW5nIGZvciBpZGVudGlmaWVycyBpbiBwcm9ncmFtICgtcW5vYXR0cikKLU9wdGlvbi5hdHRyLmZ1bGxhdHRyID0gUmVwb3J0IGF0dHJpYnV0ZXMgb2YgYWxsIGlkZW50aWZpZXJzICgtcWF0dHI9ZnVsbCkKLU9wdGlvbi5hdHRyLmF0dHIgPSBSZXBvcnQgYXR0cmlidXRlcyBvZiBvbmx5IHVzZWQgaWRlbnRpZmllcnMgKC1xYXR0cikKLU9wdGlvbi5mbGFnID0gU3BlY2lmeSB0aGUgbWluaW11bSBzZXZlcml0eSBsZXZlbCBvZiB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlcyAoLXFmbGFnPSkKLU9wdGlvbi5mb3JtYXQgPSBXYXJuIG9mIHBvc3NpYmxlIHByb2JsZW1zIHdpdGggc3RyaW5nIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0IHNwZWNpZmljYXRpb25zICgtcWZvcm1hdD0pCi1PcHRpb24uaGFsdCA9IEluc3RydWN0IHRoZSBjb21waWxlciB0byBzdG9wIGFmdGVyIGNvbXBpbGF0aW9uIGlmIGl0IGVuY291bnRlcnMgZXJyb3JzIG9mIHNwZWNpZmllZCBzZXZlcml0eSBvciBoaWdoZXIgKC1xaGFsdD0pCi1PcHRpb24uaGFsdC5pbmZvcm1hdGlvbiA9IEluZm9ybWF0aW9uICgtcWhhbHQ9aSkKLU9wdGlvbi5oYWx0Lndhcm5pbmcgPSBXYXJuaW5nICgtcWhhbHQ9dykKLU9wdGlvbi5oYWx0LmVycm9yID0gRXJyb3IgKC1xaGFsdD1lKQotT3B0aW9uLmhhbHQuc2V2ZXJlRXJyb3IgPSBTZXZlcmUgZXJyb3IgKC1xaGFsdD1zKQotT3B0aW9uLmhhbHQudW5yZWNvdmVyYWJsZUVycm9yID0gVW5yZWNvdmVyYWJsZSBlcnJvciAoLXFoYWx0PXUpCi1PcHRpb24uaW5mbyA9IFByb2R1Y2UgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAoLXFpbmZvPSkKLU9wdGlvbi5saXN0ID0gUHJvZHVjZSBhIGNvbXBpbGVyIGxpc3RpbmcgdGhhdCBpbmNsdWRlcyBhbiBvYmplY3QgbGlzdGluZyAoLXFsaXN0KQotT3B0aW9uLmxpc3RvcHQgPSBQcm9kdWNlIGEgY29tcGlsZXIgbGlzdGluZyB0aGF0IGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGVmZmVjdCgtcWxpc3RvcHQpCi1PcHRpb24ucGhzaW5mbyA9IFJlcG9ydCB0aGUgdGltZSB0YWtlbiBpbiBlYWNoIGNvbXBpbGF0aW9uIHBoYXNlICgtcXBoc2luZm8pCi1PcHRpb24ubm9wcmludCA9IFN1cHByZXNzIGFsbCBsaXN0aW5ncyAoLXFub3ByaW50ICkKLU9wdGlvbi5yZXBvcnQgPSBJbnN0cnVjdCB0aGUgY29tcGlsZXIgdG8gcHJvZHVjZSB0cmFuc2Zvcm1hdGlvbiByZXBvcnRzICgtcXJlcG9ydCkKLU9wdGlvbi5zaG93aW5jID0gU2hvdyBhbGwgaW5jbHVkZWQgZmlsZXMgaW4gdGhlIHNvdXJjZSBsaXN0aW5nICgtcXNob3dpbmMpCi1PcHRpb24uc291cmNlID0gUHJvZHVjZSBhIGNvbXBpbGVyIGxpc3RpbmcgYW5kIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlICgtcXNvdXJjZSkKLU9wdGlvbi5zcmNtc2cgPSBBZGQgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbGluZXMgdG8gdGhlIGRpYWdub3N0aWMgbWVzc2FnZXMgaW4gc3RkZXJyIGZpbGUgKC1xc3JjbXNnKQotT3B0aW9uLnN1cHByZXNzID0gU3VwcHJlc3MgdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbmFsIG9yIHdhcm5pbmcgbWVzc2FnZXMgKC1xc3VwcHJlc3M9KQotT3B0aW9uLnRhYnNpemUgPSBDaGFuZ2UgdGhlIHRhYi1zaXplICgtcXRhYnNpemU9KQotT3B0aW9uLnhyZWYgPSBQcm9kdWNlIGEgY3Jvc3MgcmVmZXJlbmNlIGxpc3Rpbmcgb2YgaWRlbnRpZmllcnMgKC1xeHJlZikKLU9wdGlvbi54cmVmLm5veHJlZiA9IERvIG5vdCByZXBvcnQgaWRlbnRpZmllcnMgaW4gdGhlIHByb2dyYW0gKC1xbm94cmVmKQotT3B0aW9uLnhyZWYuZnVsbHhyZWYgPSBSZXBvcnQgYWxsIHRoZSBpZGVudGlmaWVycyBpbiB0aGUgcHJvZ3JhbSAoLXF4cmVmID0gZnVsbCkKLU9wdGlvbi54cmVmLnhyZWYgPSBSZXBvcnQgb25seSB0aG9zZSBpZGVudGlmaWVycyB3aGljaCBhcmUgdXNlZCAoLXF4cmVmKQotT3B0aW9uLndhcm5mb3VyY2hhcmNvbnN0cyA9IEVuYWJsZSB3YXJuaW5nIG9mIGZvdXItY2hhcmFjdGVyIGNvbnN0YW50cyBpbiBzb3VyY2UKLU9wdGlvbi5yZXBvcnQgPSBQcm9kdWNlIGxpc3RpbmcgZmlsZXMgdGhhdCBzaG93IGhvdyBzZWN0aW9ucyBvZiBjb2RlIGhhdmUgYmVlbiBvcHRpbWl6ZWQgKC1xcmVwb3J0KQotCi0jIEVycm9yIENoZWNraW5nIGFuZCBEZWJ1Z2dpbmcKLU9wdGlvbi5nID0gR2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uICgtZykKLU9wdGlvbi5vcHRkZWJ1ZyA9IEVuYWJsZSBkZWJ1Z2dpbmcgb2Ygb3B0aW1pemVkIGNvZGUgKC1xb3B0ZGVidWcpCi1PcHRpb24uRGVidWdMZXZlbD1EZWJ1ZyBMZXZlbAotT3B0aW9uLkRlYnVnLk1pbj1NaW5pbWFsICgtZzEpCi1PcHRpb24uRGVidWcuRGVmPURlZmF1bHQgKC1nKQotT3B0aW9uLkRlYnVnLk1heD1NYXhpbXVtICgtZzMpCi1PcHRpb24uRGVidWcuT3RoZXI9T3RoZXIgZGVidWdnaW5nIGZsYWdzCi1PcHRpb24uRGVidWcuZ3Byb2Y9R2VuZXJhdGUgZ3Byb2YgaW5mb3JtYXRpb24gKC1wZykKLU9wdGlvbi5EZWJ1Zy5wcm9mPUdlbmVyYXRlIHByb2YgaW5mb3JtYXRpb24gKC1wKQotT3B0aW9uLkRlYnVnLlVucmVmPUluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdW5yZWZlcmVuY2VkIHN5bWJvbHMgKC1xZGJ4ZXh0cmEpCi1PcHRpb24ucCA9IEdlbmVyYXRlIHByb2YgaW5mb3JtYXRpb24gKC1wKQotT3B0aW9uLnBnID0gR2VuZXJhdGUgZ3Byb2YgaW5mb3JtYXRpb24gKC1wZykKLU9wdGlvbi5jaGVjayA9IEdlbmVyYXRlIGNvZGUgd2hpY2ggcGVyZm9ybXMgY2VydGFpbiB0eXBlcyBvZiBydW50aW1lIGNoZWNraW5nICgtcWNoZWNrKQotT3B0aW9uLmRieGV4dHJhID0gSW5jbHVkZSBhbGwgdHlwZWRlZnMsIHN0cnVjdHMsIHVuaW9ucywgZW51bXMgZm9yIGRlYnVnZ2luZyAoLXFkYnhleHRyYSkKLU9wdGlvbi5leHRjaGsgPSBHZW5lcmF0ZSBiaW5kLXRpbWUgdHlwZSBjaGVja2luZyBpbmZvcm1hdGlvbiBhbmQgY2hlY2sgZm9yIGNvbXBpbGUgdGltZSBjb25zaXN0ZW5jeSAoLXFleHRjaGspCi1PcHRpb24uZnVsbHBhdGggPSBQcmVzZXJ2ZSBhYnNvbHV0ZSBwYXRoIG5hbWUgb2Ygc291cmNlIGZpbGVzIHVzZWQgd2l0aCAtZyBvcHRpb24gKC1xZnVsbHBhdGgpCi1PcHRpb24uZ2VucHJvdG8gPSBQcm9kdWNlIEFOU0kgcHJvdG90eXBlcyBmcm9tIEsmUiBkZWZpbml0aW9ucwotT3B0aW9uLmdlbnByb3RvID0gR2VuZXJhdGUgcHJvdG90eXBlcyB3aXRoIHBhcmFtZXRlciBuYW1lcwotT3B0aW9uLmdlbnByb3RvLnBhcm1nZW5wcm90byA9IEluY2x1ZGUgcGFyYW1ldGVyIG5hbWVzIGluIHByb3RvdHlwZXMKLU9wdGlvbi5oZWFwZGVidWcgPSBFbmFibGUgZGVidWcgdmVyc2lvbnMgb2YgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zICgtcWhlYXBkZWJ1ZykKLU9wdGlvbi5pbml0YXV0byA9IEluaXRpYWxpemUgdGhlIGF1dG9tYXRpYyB2YXJpYWJsZXMgKC1xaW5pdGF1dG89KQotT3B0aW9uLmxpbmVkZWJ1ZyA9IEdlbmVyYXRlIGxpbmUgbnVtYmVyIGFuZCBzb3VyY2UgZmlsZSBuYW1lIGluZm8gZm9yIHRoZSBkZWJ1Z2dlciAoLXFsaW5lZGVidWcpCi1PcHRpb24ubWF4ZXJyID0gSGFsdCBjb21waWxhdGlvbiBhZnRlciB0aGlzIG1hbnkgZXJyb3JzICgtcW1heGVycj0pCi1PcHRpb24ucHJvdG8gPSBBbGwgZnVuY3Rpb25zIGFyZSBwcm90b3R5cGVkICgtcXByb3RvKQotCi0KLSMgQXNzZW1ibGVyIG9wdGlvbnMKLU9wdGlvbi5YbGMuQXNzZW1ibGVyLkZsYWdzPU90aGVyIGFzc2VtYmxlciBmbGFncwotT3B0aW9uLlhsYy5Bc3NlbWJsZXIud2Fybi5zdXBwcmVzcz1TdXBwcmVzcyB3YXJuaW5ncyAoLVcpCi1PcHRpb24uWGxjLkFzc2VtYmxlci52ZXJzaW9uPUFubm91bmNlIHZlcnNpb24gKC12KQotCi0KLSMgWEwgQy9DKysgUHJlZmVyZW5jZSBwYWdlCi1YTENvbXBpbGVyUHJlZmVyZW5jZVBhZ2UubmFtZSA9IFhMIEMvQysrIENvbXBpbGVyCi1YTENvbXBpbGVyUHJvcGVydHlQYWdlLm5hbWUgPSBYTCBDL0MrKyBDb21waWxlcgotCi0KLQotCi1CdW5kbGUtVmVuZG9yID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lID0gWEwgQy9DKysgUmVtb3RlIE1hbmFnZWQgQnVpbGQgU3VwcG9ydAotYnVpbGRlci5uYW1lID0gUmVtb3RlIEdOVSBNYWtlCi1leHRlbnNpb24ubmFtZSA9IFJlbW90ZSBYTCBDL0MrKyBQZXIgUHJvamVjdCBQcm9maWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL3BsdWdpbi54bWwgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViNjBmMC4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5idWlsZERlZmluaXRpb25zIj4KLSAgICAgIDxtYW5hZ2VkQnVpbGRSZXZpc2lvbgotICAgICAgICAgICAgZmlsZVZlcnNpb249IjQuMC4wIj4KLSAgICAgIDwvbWFuYWdlZEJ1aWxkUmV2aXNpb24+Ci0gICAgICA8YnVpbGRlcgotICAgICAgICAgICAgY29tbWFuZExhdW5jaGVyPSJvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUucmVtb3RlbWFrZS5SZW1vdGVDb21tYW5kTGF1bmNoZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkuYnVpbGRlcjEiCi0gICAgICAgICAgICBpc0Fic3RyYWN0PSJmYWxzZSIKLSAgICAgICAgICAgIGlzVmFyaWFibGVDYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgIG5hbWU9IiVidWlsZGVyLm5hbWUiCi0gICAgICAgICAgICBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUuYnVpbGRlciI+Ci0gICAgICA8L2J1aWxkZXI+Ci0gICAgICA8cHJvamVjdFR5cGUKLSAgICAgICAgICAgIGJ1aWxkQXJ0ZWZhY3RUeXBlPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZEFydGVmYWN0VHlwZS5leGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LnhsYy5leGUiCi0gICAgICAgICAgICBpc0Fic3RyYWN0PSJmYWxzZSIKLSAgICAgICAgICAgIGlzVGVzdD0iZmFsc2UiCi0gICAgICAgICAgICBuYW1lPSIlVGFyZ2V0TmFtZS54bGMuZXhlIgotICAgICAgICAgICAgcHJvamVjdEVudmlyb25tZW50U3VwcGxpZXI9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpLlJlbW90ZVByb2plY3RFbnZpcm9ubWVudFN1cHBsaWVyIgotICAgICAgICAgICAgcHJvamVjdE1hY3JvU3VwcGxpZXI9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkuWExDUHJvamVjdE1hY3JvU3VwcGxpZXIiPgotICAgICAgCTxjb25maWd1cmF0aW9uCi0gICAgICAJCW5hbWU9IiVDb25maWdOYW1lLkRiZyIKLSAgICAgIAkJYXJ0aWZhY3RFeHRlbnNpb249ImV4ZSIKLSAgICAgIAkJY2xlYW5Db21tYW5kPSJybSAtcmYiCi0gICAgICAJCWVycm9yUGFyc2Vycz0ib3JnLmVjbGlwc2UuY2R0LmVycm9ycGFyc2Vycy54bGMuWGxjRXJyb3JQYXJzZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLnhsYy5leGUuZGVidWciPgotCQkJPHRvb2xDaGFpbgotICAgICAgICAgICAgICAgICAgYXJjaExpc3Q9ImFsbCIKLSAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFN1cHBsaWVyPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIueGxjLmFpeC5BaXhDb25maWd1cmF0aW9uRW52aXJvbm1lbnRTdXBwbGllciIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4ueGxjLmV4ZS5kZWJ1ZyIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IiVUb29sQ2hhaW5OYW1lLkRiZyIKLSAgICAgICAgICAgICAgICAgIG9zTGlzdD0iYWxsIgotICAgICAgICAgICAgICAgICAgdGFyZ2V0VG9vbD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuYy5saW5rZXIuZXhlLmRlYnVnO29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmNwcC5saW5rZXIuZXhlLmRlYnVnIj4KLQkJCSAgICAgIDx0YXJnZXRQbGF0Zm9ybQotCQkJCQkgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50YXJnZXQueGxjLnBsYXRmb3JtLmV4ZS5kZWJ1ZyIKLQkJCQkgCSAgbmFtZT0iJVBsYXRmb3JtTmFtZS5EYmciCi0gICAgICAgICAgICAgICAgICAgICAgYmluYXJ5UGFyc2VyPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5YQ09GRjMyIiAgICAgICAgICAgIAkJCQkJICAKLQkJCQkJICBvc0xpc3Q9ImFsbCIJCQkJCSAgCi0JCQkJCSAgYXJjaExpc3Q9ImFsbCI+Ci0JCQkJICA8L3RhcmdldFBsYXRmb3JtPgotCQkJICAJICA8YnVpbGRlcgotCQkJCQkgIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLmJ1aWxkZXIuYmFzZSIKLQkJCQkJICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMuYnVpbGRlci5leGUuZGVidWciPgkJICAgICAgICAgICAgICAKLQkJCSAgICAgIDwvYnVpbGRlcj4KLQkJCSAgICAgIDx0b29sCi0gICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmNwcC5jb21waWxlci5leGUuZGVidWciCi0gICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuY3BwLmNvbXBpbGVyLmJhc2UiPgotICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQueGxjLmNwcC5jb21waWxlci5leGUuZGVidWcub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlPSJ4bGMuYy5jb21waWxlci5vcHRpbWl6YXRpb24ubGV2ZWwubm9uZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0ieGxjLmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbgotCQkJCQkJICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC54bGMuY3BwLmNvbXBpbGVyLmV4ZS5kZWJ1Zy5vcHRpb24uZGVidWdnaW5nLmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0ieGxjLmMuY29tcGlsZXIub3B0aW9uLmVjZC5nIj4KLSAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwvdG9vbD4KLSAgICAgICAgICAgICAgICAgIDx0b29sCi0JCQkJCSAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmMuY29tcGlsZXIuZXhlLmRlYnVnIgotICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmMuY29tcGlsZXIuYmFzZSI+Ci0JCQkJCSAgPG9wdGlvbgotCQkJCQkJICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC54bGMuYy5jb21waWxlci5leGUuZGVidWcub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIKLQkJCQkJCSAgZGVmYXVsdFZhbHVlPSJ4bGMuYy5vcHRpbWl6YXRpb24ubGV2ZWwubm9uZSIKLQkJCQkJCSAgc3VwZXJDbGFzcz0ieGxjLmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCI+Ci0JCQkJCSAgPC9vcHRpb24+Ci0JCQkJCSAgPG9wdGlvbgotCQkJCQkJICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC54bGMuYy5jb21waWxlci5leGUuZGVidWcub3B0aW9uLmRlYnVnZ2luZy5nIgotCQkJCQkJICBkZWZhdWx0VmFsdWU9InRydWUiCi0JCQkJCQkgIHN1cGVyQ2xhc3M9InhsYy5jLmNvbXBpbGVyLm9wdGlvbi5lY2QuZyI+Ci0JCQkJCSAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3Rvb2w+Ci0gICAgICAgICAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jLmxpbmtlci5leGUuZGVidWciCi0gICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuYy5saW5rZXIuZXhlLmJhc2UiPgotICAgICAgICAgICAgICAgICAgPC90b29sPgotICAgICAgICAgICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuY3BwLmxpbmtlci5leGUuZGVidWciCi0gICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuY3BwLmxpbmtlci5leGUuYmFzZSI+Ci0gICAgICAgICAgICAgICAgICA8L3Rvb2w+ICAgICAgICAgICAgICAgICAgCi0JCQkJICA8dG9vbAotCQkJCQkgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5hc3NlbWJsZXIuZXhlLmRlYnVnIgotCQkJCQkgIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuYXNzZW1ibGVyIj4KLQkJCQkgIDwvdG9vbD4KLQkJCSA8L3Rvb2xDaGFpbj4gIAotCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCTxjb25maWd1cmF0aW9uCi0JCQluYW1lPSIlQ29uZmlnTmFtZS5SZWwiCi0JCQlhcnRpZmFjdEV4dGVuc2lvbj0iZXhlIgotCQkJY2xlYW5Db21tYW5kPSJybSAtcmYiCi0JCQllcnJvclBhcnNlcnM9Im9yZy5lY2xpcHNlLmNkdC5lcnJvcnBhcnNlcnMueGxjLlhsY0Vycm9yUGFyc2VyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy54bGMuZXhlLnJlbGVhc2UiPgotCQkJPHRvb2xDaGFpbgotICAgICAgICAgICAgICAgICAgYXJjaExpc3Q9ImFsbCIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4ueGxjLmV4ZS5yZWxlYXNlIgotICAgICAgICAgICAgICAgICAgbmFtZT0iJVRvb2xDaGFpbk5hbWUuUmVsIgotICAgICAgICAgICAgICAgICAgb3NMaXN0PSJhbGwiCi0gICAgICAgICAgICAgICAgICB0YXJnZXRUb29sPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jLmxpbmtlci5leGUucmVsZWFzZTtvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jcHAubGlua2VyLmV4ZS5yZWxlYXNlIj4KLQkJICAgICAgICAgIDx0YXJnZXRQbGF0Zm9ybQotCQkgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50YXJnZXQueGxjLnBsYXRmb3JtLmV4ZS5yZWxlYXNlIgotCQkgICAgICAgICAgICAgIG5hbWU9IiVQbGF0Zm9ybU5hbWUuUmVsIgkJICAgICAgICAgICAgIAotCQkgICAgICAgICAgICAgIGJpbmFyeVBhcnNlcj0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuWENPRkYzMiIKLQkJICAgICAgICAgICAgICBvc0xpc3Q9ImFsbCIKLQkJICAgICAgICAgICAgICBhcmNoTGlzdD0iYWxsIj4JCSAgICAgICAgICAgICAgCi0JCSAgICAgICAgICA8L3RhcmdldFBsYXRmb3JtPgotCQkJCSAgPGJ1aWxkZXIKLQkJCQkgIAkgIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLmJ1aWxkZXIuYmFzZSIKLQkJCQkgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMuYnVpbGRlci5yZWxlYXNlIj4KLQkJCQkgIDwvYnVpbGRlcj4gCi0JCQkJICA8dG9vbAotICAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jcHAuY29tcGlsZXIuZXhlLnJlbGVhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuY3BwLmNvbXBpbGVyLmJhc2UiPiAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkgIDxvcHRpb24KLQkJCQkJCSAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQueGxjLmNwcC5jb21waWxlci5leGUucmVsZWFzZS5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsIgotCQkJCQkJICBkZWZhdWx0VmFsdWU9InhsYy5jLm9wdGltaXphdGlvbi5sZXZlbC5MZXZlbDUiCi0JCQkJCQkgIHN1cGVyQ2xhc3M9InhsYy5jLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiPgotCQkJCQkgIDwvb3B0aW9uPgotCQkJCQkgIDxvcHRpb24KLQkJCQkJCSAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQueGxjLmNwcC5jb21waWxlci5leGUucmVsZWFzZS5vcHRpb24uZGVidWdnaW5nLmciCi0JCQkJCQkgIGRlZmF1bHRWYWx1ZT0iZmFsc2UiCi0JCQkJCQkgIHN1cGVyQ2xhc3M9InhsYy5jLmNvbXBpbGVyLm9wdGlvbi5lY2QuZyI+Ci0JCQkJCSAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3Rvb2w+Ci0gICAgICAgICAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jLmNvbXBpbGVyLmV4ZS5yZWxlYXNlIgotICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmMuY29tcGlsZXIuYmFzZSI+ICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJICA8b3B0aW9uCi0JCQkJCQkgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0LnhsYy5jLmNvbXBpbGVyLmV4ZS5yZWxlYXNlLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiCi0JCQkJCQkgIGRlZmF1bHRWYWx1ZT0ieGxjLmMub3B0aW1pemF0aW9uLmxldmVsLkxldmVsNSIKLQkJCQkJCSAgc3VwZXJDbGFzcz0ieGxjLmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCI+Ci0JCQkJCSAgPC9vcHRpb24+Ci0JCQkJCSAgPG9wdGlvbgotCQkJCQkJICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC54bGMuYy5jb21waWxlci5leGUucmVsZWFzZS5vcHRpb24uZGVidWdnaW5nLmciCi0JCQkJCQkgIGRlZmF1bHRWYWx1ZT0iZmFsc2UiCi0JCQkJCQkgIHN1cGVyQ2xhc3M9InhsYy5jLmNvbXBpbGVyLm9wdGlvbi5lY2QuZyI+Ci0JCQkJCSAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3Rvb2w+Ci0gICAgICAgICAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jLmxpbmtlci5leGUucmVsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jLmxpbmtlci5leGUuYmFzZSI+Ci0gICAgICAgICAgICAgICAgICA8L3Rvb2w+IAotICAgICAgICAgICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuY3BwLmxpbmtlci5leGUucmVsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jcHAubGlua2VyLmV4ZS5iYXNlIj4KLSAgICAgICAgICAgICAgICAgIDwvdG9vbD4gIAotCQkJCSAgPHRvb2wKLQkJCQkJICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuYXNzZW1ibGVyLmV4ZS5yZWxlYXNlIgotCQkJCQkgIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmFzc2VtYmxlci5leGUuYmFzZSI+Ci0JCQkJICA8L3Rvb2w+Ci0gICAgICAgICAgICA8L3Rvb2xDaGFpbj4KLSAgICAgICAgICAgIAotCQk8L2NvbmZpZ3VyYXRpb24+Ci0JPC9wcm9qZWN0VHlwZT4JCi0JPHRvb2xDaGFpbgotICAgICAgICAgICAgICAgICAgYXJjaExpc3Q9ImFsbCIKLSAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFN1cHBsaWVyPSJSZW1vdGVDb25maWd1cmF0aW9uRW52aXJvbm1lbnRTdXBwbGllciIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4ueGxjLmJhc2UiCi0gICAgICAgICAgICAgICAgICBuYW1lPSIlVG9vbENoYWluTmFtZS5EYmciCi0gICAgICAgICAgICAgICAgICBvc0xpc3Q9ImFsbCIKLSAgICAgICAgICAgICAgICAgIHRhcmdldFRvb2w9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmMubGlua2VyLmV4ZS5kZWJ1ZztvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jcHAubGlua2VyLmV4ZS5kZWJ1ZyI+Ci0JCQkgIAkgIDxidWlsZGVyCi0JCQkJCSAgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkuYnVpbGRlcjEiCi0JCQkJCSAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLmJ1aWxkZXIuYmFzZSI+CQkgICAgICAgICAgICAgIAotCQkJICAgICAgPC9idWlsZGVyPgotCQkJICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuY3BwLmNvbXBpbGVyLmJhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jcHAuY29tcGlsZXIiPgotICAgICAgICAgICAgICAgICAgPC90b29sPgotICAgICAgICAgICAgICAgICAgPHRvb2wKLQkJCQkJICBpZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuYy5jb21waWxlci5iYXNlIgotICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuYy5jb21waWxlciI+Ci0gICAgICAgICAgICAgICAgICA8L3Rvb2w+Ci0gICAgICAgICAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jLmxpbmtlci5leGUuYmFzZSIKLSAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmMubGlua2VyIj4KLSAgICAgICAgICAgICAgICAgIDwvdG9vbD4KLSAgICAgICAgICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmNwcC5saW5rZXIuZXhlLmJhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLnhsYy5jcHAubGlua2VyIj4KLSAgICAgICAgICAgICAgICAgIDwvdG9vbD4gICAgICAgICAgICAgICAgICAKLQkJCQkgIDx0b29sCi0JCQkJCSAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmFzc2VtYmxlci5leGUuYmFzZSIKLQkJCQkJICBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmFzc2VtYmxlciI+Ci0JCQkJICA8L3Rvb2w+Ci0JCQkgPC90b29sQ2hhaW4+ICAgICAgICAJCQotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iUmVtb3RlWExDUGVyUHJvamVjdFByb2ZpbGUiCi0gICAgICAgICBuYW1lPSIlZXh0ZW5zaW9uLm5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5TY2FubmVyQ29uZmlndXJhdGlvbkRpc2NvdmVyeVByb2ZpbGUiPgotICAgICA8c2Nhbm5lckluZm9Db2xsZWN0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUucmVtb3RlbWFrZS5Qcm9qZWN0RGVzY3JpcHRpb25Db2xsZWN0b3IiCi0gICAgICAgICAgICBzY29wZT0icHJvamVjdCIvPgotICAgICAJCTwhLS0gVGhlIFNjYW5uZXJJbmZvUHJvdmlkZXIgc2VhcmNoIGZvciB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBwcm9maWxlIGFuZCBzZW5kIGl0IHRvIHRoZSBTY2FubmVySW5mb0NvbGxlY3RvciAtLT4KLQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgcHJvdmlkZXJJZD0ib3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkuc3BlY3NGaWxlIj4KLQkJCTwhLS0gU3BlY2lmaWVzIHRoZSBjb21waWxlciBjb21tYW5kIHRoYXQgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgc3RhbmRhcmQgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQgc3RhbmRhcmQgZGVmaW5pdGlvbnMgLS0+Ci0JCQk8IS0tIFRoZSBjb21waWxlciBjb21tYW5kIHVzZWQgd2lsbCBiZSBhbHdheXMgYSBDIGNvbXBpbGVyIGNvbW1hbmQgLS0+Ci0JCQk8IS0tIFRoZSBvdXRwdXQgZm9yIEMgb3IgQysrIHByb2plY3RzIHdpbGwgYmUgZGlmZmVyZW50IGFzIHRoZSBTY2FubmVySW5mb1Byb3ZpZGVyIHN1YnN0aXR1dGUgdGhlICR7c3BlY3NfZmlsZX0gdmFyaWFibGUgYmVsb3cgd2l0aCBhIGR1bW15ICJjIiBmaWxlIG9yICJjcHAiIGZpbGUgLS0+Ci0JCQk8cnVuCi0JCQkJCWFyZ3VtZW50cz0iLUUgLXYgJHtzcGVjc19maWxlX3BhdGh9IgotCQkJCQljb21tYW5kPSIke1hMX2NvbXBpbGVyUm9vdH0veGxDIgotCQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZW1ha2UuUmVtb3RlU3BlY3NSdW5TSVByb3ZpZGVyIj4KLQkJCTwvcnVuPgotCQkJPCEtLSBTcGVjaWZpZXMgdGhlIHBhcnNlciBmb3IgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgbGluZSAtLT4KLQkJCTxzY2FubmVySW5mb0NvbnNvbGVQYXJzZXIKLQkJCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLnhsYy5jb3JlLnNjYW5uZXJjb25maWcuWGxDU3BlY3NDb25zb2xlUGFyc2VyIj4KLQkJCTwvc2Nhbm5lckluZm9Db25zb2xlUGFyc2VyPgotCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvc3JjL1JlbW90ZUNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFN1cHBsaWVyLmphdmEgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvc3JjL1JlbW90ZUNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFN1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzk3N2MuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpL3NyYy9SZW1vdGVDb25maWd1cmF0aW9uRW52aXJvbm1lbnRTdXBwbGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5JQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5JTWFuYWdlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmVudnZhci5JQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5lbnZ2YXIuSUNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFZhcmlhYmxlU3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmVudnZhci5JRW52aXJvbm1lbnRWYXJpYWJsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5pbnRlcm5hbC5lbnZ2YXIuQnVpbGRFbnZWYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLlJEVExvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUuc2VydmljZXByb3ZpZGVycy5JUmVtb3RlRXhlY3V0aW9uU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5zZXJ2aWNlcy5JUkRUU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVQcm9jZXNzQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5Qcm9qZWN0Tm90Q29uZmlndXJlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotCi0KLS8qKgotICogU3VwcGxpZXMgcmVtb3RlIGVudmlyb25tZW50IHZhcmlhYmxlcyBvbiBhIHBlci1jb25maWd1cmF0aW9uIGJhc2lzLgotICogUmlnaHQgbm93IGl0IGFjdHVhbGx5IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgc2VydmljZSBtb2RlbCBjb25maWd1cmF0aW9ucywgc28gdGhpcyBqdXN0Ci0gKiBhY3RzIHRoZSBzYW1lIGFzIHRoZSBSZW1vdGVQcm9qZWN0RW52aXJvbm1lbnRTdXBwbGllciBhdCB0aGUgbW9tZW50LgotICogCi0gKiBAYXV0aG9yIGNyZWNvc2tpZQotICoKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBSZW1vdGVDb25maWd1cmF0aW9uRW52aXJvbm1lbnRTdXBwbGllciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmF0aW9uRW52aXJvbm1lbnRWYXJpYWJsZVN1cHBsaWVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5lbnZ2YXIuSUNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFZhcmlhYmxlU3VwcGxpZXIjZ2V0VmFyaWFibGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuSUNvbmZpZ3VyYXRpb24sIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5lbnZ2YXIuSUVudmlyb25tZW50VmFyaWFibGVQcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgSUJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZSBnZXRWYXJpYWJsZShTdHJpbmcgdmFyaWFibGVOYW1lLAotCQkJSUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSUVudmlyb25tZW50VmFyaWFibGVQcm92aWRlciBwcm92aWRlcikgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGVudk1hcCA9IGdldFJlbW90ZUVudmlyb25tZW50KGNvbmZpZ3VyYXRpb24uZ2V0TWFuYWdlZFByb2plY3QoKSk7Ci0JCVN0cmluZyB2YWx1ZSA9IGVudk1hcC5nZXQodmFyaWFibGVOYW1lKSA9PSBudWxsID8gbmV3IFN0cmluZygpIDogZW52TWFwLmdldCh2YXJpYWJsZU5hbWUpOwotCQlJQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlIGVudlZhciA9IG5ldyBCdWlsZEVudlZhcih2YXJpYWJsZU5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIGVudlZhcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuZW52dmFyLklDb25maWd1cmF0aW9uRW52aXJvbm1lbnRWYXJpYWJsZVN1cHBsaWVyI2dldFZhcmlhYmxlcyhvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5JQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmVudnZhci5JRW52aXJvbm1lbnRWYXJpYWJsZVByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyBJQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKAotCQkJSUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSUVudmlyb25tZW50VmFyaWFibGVQcm92aWRlciBwcm92aWRlcikgewotCQlMaXN0PElCdWlsZEVudmlyb25tZW50VmFyaWFibGU+IHZhcnMgPSBuZXcgTGlua2VkTGlzdDxJQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlPigpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlbW90ZUVudk1hcCA9IG51bGw7Ci0JCQotCQlyZW1vdGVFbnZNYXAgPSBnZXRSZW1vdGVFbnZpcm9ubWVudChjb25maWd1cmF0aW9uLmdldE1hbmFnZWRQcm9qZWN0KCkpOwotCQkKLQkJaWYgKHJlbW90ZUVudk1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyB2YXIgOiByZW1vdGVFbnZNYXAua2V5U2V0KCkpIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSByZW1vdGVFbnZNYXAuZ2V0KHZhcik7Ci0KLQkJCQlJQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlIGJ1aWxkRW52VmFyID0gbmV3IEJ1aWxkRW52VmFyKHZhciwKLQkJCQkJCXZhbHVlKTsKLQkJCQl2YXJzLmFkZChidWlsZEVudlZhcik7Ci0JCQl9Ci0KLQkJCXJldHVybiB2YXJzLnRvQXJyYXkobmV3IElCdWlsZEVudmlyb25tZW50VmFyaWFibGVbMF0pOwotCQl9Ci0JCQotCQllbHNlCi0JCQlyZXR1cm4gbmV3IElCdWlsZEVudmlyb25tZW50VmFyaWFibGVbMF07Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHJlbW90ZUVudk1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVtb3RlRW52aXJvbm1lbnQoSU1hbmFnZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJSVByb2plY3QgaVByb2ogPSAoSVByb2plY3QpIHByb2plY3QuZ2V0T3duZXIoKTsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiByZW1vdGVFbnZNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCQlTZXJ2aWNlTW9kZWxNYW5hZ2VyIHNtbSA9IFNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQotCQl0cnkgewotCQkJSVNlcnZpY2VDb25maWd1cmF0aW9uIHNlcnZpY2VDb25maWcgPSBzbW0KLQkJCQkJLmdldEFjdGl2ZUNvbmZpZ3VyYXRpb24oaVByb2opOwotCQkJSVNlcnZpY2UgYnVpbGRTZXJ2aWNlID0gc21tCi0JCQkJCS5nZXRTZXJ2aWNlKElSRFRTZXJ2aWNlQ29uc3RhbnRzLlNFUlZJQ0VfQlVJTEQpOwotCQkJSVNlcnZpY2VQcm92aWRlciBzZXJ2aWNlUHJvdmlkZXIgPSBzZXJ2aWNlQ29uZmlnCi0JCQkJCS5nZXRTZXJ2aWNlUHJvdmlkZXIoYnVpbGRTZXJ2aWNlKTsKLQkJCUlSZW1vdGVFeGVjdXRpb25TZXJ2aWNlUHJvdmlkZXIgZXhlY3V0aW9uUHJvdmlkZXIgPSBudWxsOwotCQkJaWYgKHNlcnZpY2VQcm92aWRlciBpbnN0YW5jZW9mIElSZW1vdGVFeGVjdXRpb25TZXJ2aWNlUHJvdmlkZXIpIHsKLQkJCQlleGVjdXRpb25Qcm92aWRlciA9IChJUmVtb3RlRXhlY3V0aW9uU2VydmljZVByb3ZpZGVyKSBzZXJ2aWNlUHJvdmlkZXI7Ci0JCQl9Ci0KLQkJCWlmIChleGVjdXRpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0KLQkJCQlJUmVtb3RlU2VydmljZXMgcmVtb3RlU2VydmljZXMgPSBleGVjdXRpb25Qcm92aWRlcgotCQkJCQkJLmdldFJlbW90ZVNlcnZpY2VzKCk7Ci0KLQkJCQlJUmVtb3RlQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZXhlY3V0aW9uUHJvdmlkZXIKLQkJCQkJCS5nZXRDb25uZWN0aW9uKCk7Ci0KLQkJCQlpZiAoIWNvbm5lY3Rpb24uaXNPcGVuKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbm5lY3Rpb24ub3BlbihudWxsKTsKLQkJCQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlSRFRMb2cubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0PFN0cmluZz4gY29tbWFuZCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQotCQkJCUlSZW1vdGVQcm9jZXNzQnVpbGRlciBwcm9jZXNzQnVpbGRlciA9IHJlbW90ZVNlcnZpY2VzCi0JCQkJCQkuZ2V0UHJvY2Vzc0J1aWxkZXIoY29ubmVjdGlvbiwgY29tbWFuZCk7Ci0KLQkJCQlyZW1vdGVFbnZNYXAgPSBwcm9jZXNzQnVpbGRlci5lbnZpcm9ubWVudCgpOwotCi0JCQl9Ci0JCX0gY2F0Y2ggKFByb2plY3ROb3RDb25maWd1cmVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdlIGNhbiBnZXQgaGVyZSB3aGVuIHRoZSBlbnZpcm9ubWVudCBzdXBwbGllciBpcyBjYWxsZWQgZHVyaW5nCi0JCQkvLyBwcm9qZWN0IGNyZWF0aW9uLCBzaW5jZSB0aGUgc2VydmljZSBtb2RlbCBpcyBub3QgeWV0IHNldHVwLgotCQkJLy8gU3dhbGxvdyB0aGUgZXJyb3IuCi0JCX0KLQkJcmV0dXJuIHJlbW90ZUVudk1hcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JkdC9tYW5hZ2VkYnVpbGRlci94bGMvdWkvQWN0aXZhdG9yLmphdmEgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZHQvbWFuYWdlZGJ1aWxkZXIveGxjL3VpL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTY3ZWIyLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JkdC9tYW5hZ2VkYnVpbGRlci94bGMvdWkvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JkdC9tYW5hZ2VkYnVpbGRlci94bGMvdWkvUmVtb3RlUHJvamVjdEVudmlyb25tZW50U3VwcGxpZXIuamF2YSBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JkdC9tYW5hZ2VkYnVpbGRlci94bGMvdWkvUmVtb3RlUHJvamVjdEVudmlyb25tZW50U3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzMzQzYi4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZHQvbWFuYWdlZGJ1aWxkZXIveGxjL3VpL1JlbW90ZVByb2plY3RFbnZpcm9ubWVudFN1cHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5JTWFuYWdlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmVudnZhci5JQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5lbnZ2YXIuSUVudmlyb25tZW50VmFyaWFibGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuZW52dmFyLklQcm9qZWN0RW52aXJvbm1lbnRWYXJpYWJsZVN1cHBsaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5pbnRlcm5hbC5lbnZ2YXIuQnVpbGRFbnZWYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLlJEVExvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUuc2VydmljZXByb3ZpZGVycy5JUmVtb3RlRXhlY3V0aW9uU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5zZXJ2aWNlcy5JUkRUU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVQcm9jZXNzQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5Qcm9qZWN0Tm90Q29uZmlndXJlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotCi0vKioKLSAqIFN1cHBsaWVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLgotICogCi0gKiBAYXV0aG9yIGNyZWNvc2tpZQotICoKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBSZW1vdGVQcm9qZWN0RW52aXJvbm1lbnRTdXBwbGllciBpbXBsZW1lbnRzCi0JCUlQcm9qZWN0RW52aXJvbm1lbnRWYXJpYWJsZVN1cHBsaWVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5lbnZ2YXIuSVByb2plY3RFbnZpcm9ubWVudFZhcmlhYmxlU3VwcGxpZXIjZ2V0VmFyaWFibGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuSU1hbmFnZWRQcm9qZWN0LCBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuZW52dmFyLklFbnZpcm9ubWVudFZhcmlhYmxlUHJvdmlkZXIpCi0JICovCi0JcHVibGljIElCdWlsZEVudmlyb25tZW50VmFyaWFibGUgZ2V0VmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSwKLQkJCUlNYW5hZ2VkUHJvamVjdCBwcm9qZWN0LCBJRW52aXJvbm1lbnRWYXJpYWJsZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gZW52TWFwID0gZ2V0UmVtb3RlRW52aXJvbm1lbnQocHJvamVjdCk7Ci0JCVN0cmluZyB2YWx1ZSA9IGVudk1hcC5nZXQodmFyaWFibGVOYW1lKSA9PSBudWxsID8gbmV3IFN0cmluZygpIDogZW52TWFwLmdldCh2YXJpYWJsZU5hbWUpOwotCQlJQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlIGVudlZhciA9IG5ldyBCdWlsZEVudlZhcih2YXJpYWJsZU5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIGVudlZhcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuZW52dmFyLklQcm9qZWN0RW52aXJvbm1lbnRWYXJpYWJsZVN1cHBsaWVyI2dldFZhcmlhYmxlcyhvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5JTWFuYWdlZFByb2plY3QsIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5lbnZ2YXIuSUVudmlyb25tZW50VmFyaWFibGVQcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgSUJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVtdIGdldFZhcmlhYmxlcyhJTWFuYWdlZFByb2plY3QgcHJvamVjdCwKLQkJCUlFbnZpcm9ubWVudFZhcmlhYmxlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJCi0JCUxpc3Q8SUJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZT4gdmFycyA9IG5ldyBMaW5rZWRMaXN0PElCdWlsZEVudmlyb25tZW50VmFyaWFibGU+KCk7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVtb3RlRW52TWFwID0gbnVsbDsKLQkJCi0JCXJlbW90ZUVudk1hcCA9IGdldFJlbW90ZUVudmlyb25tZW50KHByb2plY3QpOwotCQkKLQkJaWYgKHJlbW90ZUVudk1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyB2YXIgOiByZW1vdGVFbnZNYXAua2V5U2V0KCkpIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSByZW1vdGVFbnZNYXAuZ2V0KHZhcik7Ci0KLQkJCQlJQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlIGJ1aWxkRW52VmFyID0gbmV3IEJ1aWxkRW52VmFyKHZhciwKLQkJCQkJCXZhbHVlKTsKLQkJCQl2YXJzLmFkZChidWlsZEVudlZhcik7Ci0JCQl9Ci0KLQkJCXJldHVybiB2YXJzLnRvQXJyYXkobmV3IElCdWlsZEVudmlyb25tZW50VmFyaWFibGVbMF0pOwotCQl9Ci0JCQotCQllbHNlCi0JCQlyZXR1cm4gbmV3IElCdWlsZEVudmlyb25tZW50VmFyaWFibGVbMF07Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSByZW1vdGVFbnZNYXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFJlbW90ZUVudmlyb25tZW50KElNYW5hZ2VkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQcm9qZWN0IGlQcm9qID0gKElQcm9qZWN0KSBwcm9qZWN0LmdldE93bmVyKCk7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVtb3RlRW52TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkJU2VydmljZU1vZGVsTWFuYWdlciBzbW0gPSBTZXJ2aWNlTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0KLQkJdHJ5IHsKLQkJCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBzZXJ2aWNlQ29uZmlnID0gc21tCi0JCQkJCS5nZXRBY3RpdmVDb25maWd1cmF0aW9uKGlQcm9qKTsKLQkJCUlTZXJ2aWNlIGJ1aWxkU2VydmljZSA9IHNtbQotCQkJCQkuZ2V0U2VydmljZShJUkRUU2VydmljZUNvbnN0YW50cy5TRVJWSUNFX0JVSUxEKTsKLQkJCUlTZXJ2aWNlUHJvdmlkZXIgc2VydmljZVByb3ZpZGVyID0gc2VydmljZUNvbmZpZwotCQkJCQkuZ2V0U2VydmljZVByb3ZpZGVyKGJ1aWxkU2VydmljZSk7Ci0JCQlJUmVtb3RlRXhlY3V0aW9uU2VydmljZVByb3ZpZGVyIGV4ZWN1dGlvblByb3ZpZGVyID0gbnVsbDsKLQkJCWlmIChzZXJ2aWNlUHJvdmlkZXIgaW5zdGFuY2VvZiBJUmVtb3RlRXhlY3V0aW9uU2VydmljZVByb3ZpZGVyKSB7Ci0JCQkJZXhlY3V0aW9uUHJvdmlkZXIgPSAoSVJlbW90ZUV4ZWN1dGlvblNlcnZpY2VQcm92aWRlcikgc2VydmljZVByb3ZpZGVyOwotCQkJfQotCi0JCQlpZiAoZXhlY3V0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCi0JCQkJSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2VzID0gZXhlY3V0aW9uUHJvdmlkZXIKLQkJCQkJCS5nZXRSZW1vdGVTZXJ2aWNlcygpOwotCi0JCQkJSVJlbW90ZUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGV4ZWN1dGlvblByb3ZpZGVyCi0JCQkJCQkuZ2V0Q29ubmVjdGlvbigpOwotCi0JCQkJaWYgKCFjb25uZWN0aW9uLmlzT3BlbigpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb25uZWN0aW9uLm9wZW4obnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJCQkJUkRUTG9nLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTGlzdDxTdHJpbmc+IGNvbW1hbmQgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0KLQkJCQlJUmVtb3RlUHJvY2Vzc0J1aWxkZXIgcHJvY2Vzc0J1aWxkZXIgPSByZW1vdGVTZXJ2aWNlcwotCQkJCQkJLmdldFByb2Nlc3NCdWlsZGVyKGNvbm5lY3Rpb24sIGNvbW1hbmQpOwotCi0JCQkJcmVtb3RlRW52TWFwID0gcHJvY2Vzc0J1aWxkZXIuZW52aXJvbm1lbnQoKTsKLQotCQkJfQotCQl9IGNhdGNoIChQcm9qZWN0Tm90Q29uZmlndXJlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXZSBjYW4gZ2V0IGhlcmUgd2hlbiB0aGUgZW52aXJvbm1lbnQgc3VwcGxpZXIgaXMgY2FsbGVkIGR1cmluZwotCQkJLy8gcHJvamVjdCBjcmVhdGlvbiwgc2luY2UgdGhlIHNlcnZpY2UgbW9kZWwgaXMgbm90IHlldCBzZXR1cC4KLQkJCS8vIFN3YWxsb3cgdGhlIGVycm9yLgotCQl9Ci0JCXJldHVybiByZW1vdGVFbnZNYXA7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5jbGFzc3BhdGggYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFlZWE4Li4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3VpdGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLnByb2plY3QgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxOTI2Yy4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ4MmYyLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1dlZCBOb3YgMTkgMTM6NTA6NTkgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1YTI3OS4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucmR0LnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2UuY2R0LnVpLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSI1LjAuMiIsCi0gb3JnLmVjbGlwc2UuY2R0LnVpO2J1bmRsZS12ZXJzaW9uPSI1LjAuMiIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmU7YnVuZGxlLXZlcnNpb249IjUuMC4yIiwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iNS4wLjEiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjIiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLm5hdmlnYXRpb24sCi0gb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5zdWl0ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5SRFRVSVRlc3RQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudWkucGFydApkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNTZhY2MuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSB0ZXN0LyxcCi0gICAgICAgICAgIHN1aXRlLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5jIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNiNTNkLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI2ltcG9ydCAidGVzdC5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQotfQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5oIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuaAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9zdWl0ZS9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL1JEVFVJVGVzdFBsdWdpbi5qYXZhIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9SRFRVSVRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNzdjNi4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9zdWl0ZS9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL1JEVFVJVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBSRFRVSVRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCQotCXByaXZhdGUgc3RhdGljIFJEVFVJVGVzdFBsdWdpbiBwbHVnaW47Ci0JCi0JcHVibGljIFJEVFVJVGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJEVFVJVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLX0KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlCYXNpY1Rlc3RTdWl0ZS5qYXZhIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUJhc2ljVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzYyNjAuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUJhc2ljVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5zdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLS8qKgotICogVGVzdHMgdGhhdCBkbyBub3QgcmVxdWlyZSBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgVUlCYXNpY1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoVUlCYXNpY1Rlc3RTdWl0ZS5jbGFzcy5nZXROYW1lKCkpOwotCQkvLyBUT0RPIGFkZCBzb21lIHRlc3RzCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUNvbm5lY3Rpb25UZXN0U3VpdGUuamF2YSBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlDb25uZWN0aW9uVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDY4YjcuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUNvbm5lY3Rpb25UZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLnN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLm5hdmlnYXRpb24uTmF2aWdhdGlvblRlc3RzOwotCi0KLS8qKgotICogVGVzdHMgdGhhdCByZXF1aXJlIGEgY29ubmVjdGlvbiB0byBiZSBydW4sCi0gKiB0aGlzIHN1aXRlIG11c3QgYmUgbGF1bmNoZWQgZnJvbSBhIENvbm5lY3Rpb25TdWl0ZS4KLSAqLwotcHVibGljIGNsYXNzIFVJQ29ubmVjdGlvblRlc3RTdWl0ZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoVUlDb25uZWN0aW9uVGVzdFN1aXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KE5hdmlnYXRpb25UZXN0cy5zdWl0ZSgpKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvdGVzdC9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL25hdmlnYXRpb24vTmF2aWdhdGlvblRlc3RzLmphdmEgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy90ZXN0L29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmYzE3OC4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy90ZXN0L29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMubmF2aWdhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5DQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmluZGV4LklJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5JTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSVRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5tb2RlbC5BU1RDYWNoZS5BU1RSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5wYXJzZXIuUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS5lZGl0b3IuQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLnVpLmVkaXRvci5DRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZXN0cy50ZXh0LkVkaXRvclRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LnVpLnRlc3RzLnRleHQuc2VsZWN0aW9uLkNQUFNlbGVjdGlvblRlc3RzQW55SW5kZXhlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucmR0LmNvcmUuaW5kZXguUmVtb3RlRmFzdEluZGV4ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJkdC51aS5zZWFyY2guYWN0aW9ucy5PcGVuRGVjbGFyYXRpb25zQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cy5Db25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHMuUmVtb3RlVGVzdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uVGVzdHMgZXh0ZW5kcyBDUFBTZWxlY3Rpb25UZXN0c0FueUluZGV4ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XQUlUX1RJTUUgPSAxMjAwMDA7Ci0KLQkvKiBJIHRoaW5rIGEgbG90IG9mIHRoZSB0ZXN0cyB0aGF0IGZhaWwgZG8gc28gYmVjYXVzZSBvZiB0d28gcmVhc29uczoKLQkgKiAtIEhlYWRlcnMgYXJlIG5vdCBiZWluZyBza2lwcGVkIGFzIHRoZXkgc2hvdWxkIGJlLCAKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVFNfVE9fUlVOID0gewotCQkidGVzdEJ1ZzkzMjgxIiwKLQkJInRlc3RCdWcyMDczMjAiLAotCQkidGVzdFRlbXBsYXRlQ2xhc3NNZXRob2RfMjA3MzIwIiwKLQkJLy8idGVzdEJhc2ljRGVmaW5pdGlvbiIsIC8vIEZBSUwgY2Fubm90IHJlcHJvZHVjZSBmYWlsdXJlCi0JCSJ0ZXN0QmFzaWNUZW1wbGF0ZUluc3RhbmNlXzIwNzMyMCIsCi0JCSJ0ZXN0QnVnODY4MjlBIiwKLQkJLy8idGVzdENQUFNwZWNEZWNsc0RlZnMiLCAvLyBGQUlMIGNhbm5vdCByZXByb2R1Y2UgZmFpbHVyZQotCQkidGVzdEJ1ZzE2ODUzMyIsCi0JCSJ0ZXN0QnVnOTUyMjUiLAotCQkvLyJ0ZXN0QnVnOTUyMDIiLCAvLyBGQUlMLCBzaG91bGQgbm90IGZhaWwgd2hlbiBoZWFkZXJzIGFyZSBza2lwcGVkIHByb3Blcmx5Ci0JCSJ0ZXN0QnVnMTAxMjg3IiwKLQkJInRlc3RCdWcxMDIyNTgiLAotCQkidGVzdEJ1ZzEwMzMyMyIsCi0JCSJ0ZXN0QnVnNzgzNTQiLAotCQkvLyJ0ZXN0QnVnMTAzNjk3IiwgLy8gRkFJTCB0cnlpbmcgdG8gdXNlIGxvY2FsIHBhdGggd2hpY2ggZmFpbHMKLQkJLy8idGVzdEJ1ZzEwODIwMiIsIC8vIEZBSUwKLQkJLy8idGVzdENOYXZpZ2F0aW9uSW5DcHBQcm9qZWN0X2J1ZzE4Mzk3MyIsIC8vIEZBSUwKLQkJLy8idGVzdEZ1bmNXaXRoVHlwZWRlZkZvckFub255bW91c1N0cnVjdF8xOTA3MzAiLCAvLyBGQUlMCi0JCS8vInRlc3RGdW5jV2l0aFR5cGVkZWZGb3JBbm9ueW1vdXNFbnVtXzE5MDczMCIsIC8vIEZBSUwKLQkJInRlc3RNYWNyb05hdmlnYXRpb24iLAotCQkidGVzdE1hY3JvTmF2aWdhdGlvbl9CdWcyMDgzMDAiLAotCQkidGVzdEluY2x1ZGVOYXZpZ2F0aW9uIiwKLQkJLy8idGVzdE5hdmlnYXRpb25DcHBDYWxsc0MiLCAvLyBGQUlMCi0JCS8vInRlc3ROYXZpZ2F0aW9uQ0NhbGxzQ3BwIiwgLy8gRkFJTAotCQkidGVzdE5hdmlnYXRpb25JbkRlZmluZWRFeHByZXNzaW9uXzIxNTkwNiIsCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCS8vcmV0dXJuIHN1aXRlKE5hdmlnYXRpb25UZXN0cy5jbGFzcyk7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJZm9yKFN0cmluZyB0ZXN0TmFtZSA6IFRFU1RTX1RPX1JVTikKLQkJCXN1aXRlLmFkZFRlc3QobmV3IE5hdmlnYXRpb25UZXN0cyh0ZXN0TmFtZSkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAibmF2aWdhdGlvbl90ZXN0X3Byb2plY3QiOwotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UucHRwLnJkdC51aS5lZGl0b3IuQ0VkaXRvciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgd2FpdFVudGlsRmlsZUlzSW5kZXhlZChJSW5kZXggaW5kZXgsIElGaWxlIGZpbGUsIGludCBtYXhtaWxsaXMpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWQuc2xlZXAoMTAwMDApOwotICAgICAgICBDQ29yZVBsdWdpbi5nZXRJbmRleE1hbmFnZXIoKS5qb2luSW5kZXhlcihNQVhfV0FJVF9USU1FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgTmF2aWdhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUsIFJlbW90ZUZhc3RJbmRleGVyLklEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElBU1ROb2RlIHRlc3RGMyhJRmlsZSBmaWxlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQl0aHJvdyBuZXcgUGFyc2VyRXhjZXB0aW9uKCJvZmZzZXQgY2FuIG5vdCBiZSBsZXNzIHRoYW4gMCBhbmQgd2FzICIgKyBvZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFydCA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBnZXRFZGl0b3JJRCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBDRWRpdG9yKSB7Ci0gICAgICAgIAlDRWRpdG9yIGVkaXRvcj0gKENFZGl0b3IpIHBhcnQ7Ci0gICAgCQlFZGl0b3JUZXN0SGVscGVyLmpvaW5SZWNvbmNpbGVyKEVkaXRvclRlc3RIZWxwZXIuZ2V0U291cmNlVmlld2VyKGVkaXRvciksIDEwMCwgNTAwLCAxMCk7Ci0gICAgICAgICAgICAoKEFic3RyYWN0VGV4dEVkaXRvcilwYXJ0KS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbihvZmZzZXQsbGVuZ3RoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIE9wZW5EZWNsYXJhdGlvbnNBY3Rpb24gYWN0aW9uID0gKE9wZW5EZWNsYXJhdGlvbnNBY3Rpb24pIGVkaXRvci5nZXRBY3Rpb24oIk9wZW5EZWNsYXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYWN0aW9uLnJ1blN5bmMoKTsKLQkJCQotICAgICAgICAJLy8gdXBkYXRlIHRoZSBmaWxlL3BhcnQgdG8gcG9pbnQgdG8gdGhlIG5ld2x5IG9wZW5lZCBJRmlsZS9JRWRpdG9yUGFydAotICAgICAgICAgICAgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOyAKLSAgICAgICAgICAgIGFzc2VydFRydWUgKHBhcnQgaW5zdGFuY2VvZiBDRWRpdG9yKTsKLSAgICAgICAgICAgIGVkaXRvcj0gKENFZGl0b3IpIHBhcnQ7Ci0gICAgCQlFZGl0b3JUZXN0SGVscGVyLmpvaW5SZWNvbmNpbGVyKEVkaXRvclRlc3RIZWxwZXIuZ2V0U291cmNlVmlld2VyKGVkaXRvciksIDEwMCwgNTAwLCAxMCk7Ci0KLSAgICAJCS8vIHRoZSBhY3Rpb24gYWJvdmUgc2hvdWxkIGhpZ2hsaWdodCB0aGUgZGVjbGFyYXRpb24sIHNvIG5vdyByZXRyaWV2ZSBpdCBhbmQgdXNlIHRoYXQgc2VsZWN0aW9uIHRvIGdldCB0aGUgSUFTVE5hbWUgc2VsZWN0ZWQgb24gdGhlIFRVCi0gICAgICAgICAgICBJU2VsZWN0aW9uIHNlbD0gZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElBU1ROYW1lW10gcmVzdWx0PSB7bnVsbH07Ci0gICAgICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIAlmaW5hbCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsID0gKElUZXh0U2VsZWN0aW9uKXNlbDsKLSAgICAgICAgICAgIAlJVHJhbnNsYXRpb25Vbml0IHR1ID0gKElUcmFuc2xhdGlvblVuaXQpZWRpdG9yLmdldElucHV0Q0VsZW1lbnQoKTsKLSAgICAgICAgCQlJU3RhdHVzIG9rPSBBU1RQcm92aWRlci5nZXRBU1RQcm92aWRlcigpLnJ1bk9uQVNUKHR1LCBBU1RQcm92aWRlci5XQUlUX0lGX09QRU4sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG5ldyBBU1RSdW5uYWJsZSgpIHsKLSAgICAgICAgCQkJcHVibGljIElTdGF0dXMgcnVuT25BU1QoSUxhbmd1YWdlIGxhbmd1YWdlLCBJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAJCQkJcmVzdWx0WzBdPSBhc3QuZ2V0Tm9kZVNlbGVjdG9yKG51bGwpLmZpbmROYW1lKHRleHRTZWwuZ2V0T2Zmc2V0KCksIHRleHRTZWwuZ2V0TGVuZ3RoKCkpOwotICAgICAgICAJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9KTsKLSAgICAgICAgCQlhc3NlcnRUcnVlKG9rLmlzT0soKSk7Ci0JCQkJcmV0dXJuIHJlc3VsdFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9zdXBlci5zZXRVcCgpOwotCQkKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZT0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlWaWV3UmVmZXJlbmNlW10gcmVmcz0gcGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaWV3UmVmZXJlbmNlIHZpZXdSZWZlcmVuY2UgPSByZWZzW2ldOwotCQkJcGFnZS5zZXRQYXJ0U3RhdGUodmlld1JlZmVyZW5jZSwgSVdvcmtiZW5jaFBhZ2UuU1RBVEVfUkVTVE9SRUQpOwotCQl9Ci0JCQotCQlVUkkgcHJvamVjdFJvb3RVUkkgPSBDb25uZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFdvcmtzcGFjZVVSSShQUk9KRUNUX05BTUUpOwotCQlSZW1vdGVUZXN0UHJvamVjdCByZW1vdGVQcm9qZWN0ID0gbmV3IFJlbW90ZVRlc3RQcm9qZWN0KFBST0pFQ1RfTkFNRSwgcHJvamVjdFJvb3RVUkkpOwotCQkKLQkJQ29ubmVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZXNldFNlcnZpY2VNb2RlbChyZW1vdGVQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCVNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcmludFNlcnZpY2VNb2RlbCgpOwotCQkKLQkJZkNQcm9qZWN0ID0gcmVtb3RlUHJvamVjdC5nZXRDUHJvamVjdCgpOwotCQotCQlDQ29yZVBsdWdpbi5nZXRJbmRleE1hbmFnZXIoKS5zZXRJbmRleGVySWQoZkNQcm9qZWN0LCBSZW1vdGVGYXN0SW5kZXhlci5JRCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7IAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcmVsZW5nLy5jdnNpZ25vcmUgYi9yZWxlbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZWRmNi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS5wcm9qZWN0CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTZiYmMuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzI2ZTk4Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAotZ2VuZXJhdGVGZWF0dXJlVmVyc2lvblN1ZmZpeD10cnVlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjVkYjk0Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwOCBJQk0gQ29ycG9yYXRpb24KLSMKLSMgZmVhdHVyZXMucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIFVQQyBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QWRkcyBhIHJhbmdlIG9mIHN0YXRpYyBhbmFseXNpcyBhbmQgcHJvZ3JhbW1pbmcgYXNzaXN0YW5jZSB0b29scy4KLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsMjAwOCBJQk1cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi0KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5NzY2OC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5jb3JlIiB2ZXJzaW9uPSI0LjAuMiIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5kb2MudXNlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhcnNlci51cGMiIHZlcnNpb249IjUuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8uY3ZzaWdub3JlIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5NDI5ZS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1yZXN1bHRzCi10b29scwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwMWRlNy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5yZWxlbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9idWlsZC5zaCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTk3ODhiLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgZXhwb3J0IGRpc3BsYXkgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzCi1leHBvcnQgRElTUExBWT06MQotCi0jIHNldCB1cCB0byB1c2UgdGhlIEphdmEgNSBKUkUKLWV4cG9ydCBQQVRIPS9vcHQvcHVibGljL2NvbW1vbi9pYm0tamF2YTItcHBjLTUwL2JpbjokUEFUSAotCi0jIG1ha2Ugc3VyZSB3ZSdyZSBpbiB0aGUgcmVsZW5nIHByb2plY3QgZGlyIAotY2QgYGRpcm5hbWUgJDBgCi0KLXVtYXNrIDAwMjIKLQotIyBDaGVja291dCBiYXNlYnVpbGRlciB0byBydW4gdGhlIGJ1aWxkCi1ta2RpciAtcCB0b29scwotY2QgdG9vbHMKLWN2cyAtZDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSBcCi0JY2hlY2tvdXQgLXIgUjM1X1JDMiBvcmcuZWNsaXBzZS5yZWxlbmcuYmFzZWJ1aWxkZXIKLWNkIC4uCi0KLSMgTGV0J3MgZ28hCi1qYXZhIC1qYXIgdG9vbHMvb3JnLmVjbGlwc2UucmVsZW5nLmJhc2VidWlsZGVyL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5qYXIgXAotCS13cyBndGsgLWFyY2ggcHBjIC1vcyBsaW51eCAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyICQqCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2I3ZDM3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQVFAiIGRlZmF1bHQ9Im5pZ2h0bHkiPgotCTx0YXJnZXQgbmFtZT0iaGkiPgotCQk8ZWNobyBtZXNzYWdlPSIke2VjbGlwc2UuaG9tZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJ6aXBzLHRlc3QiLz4KLQk8dGFyZ2V0IG5hbWU9Im5pZ2h0bHkiIGRlcGVuZHM9InRhZyx6aXBzLHNpZ24sdGVzdCxjb3B5Ii8+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0YnVpbGQiIGRlcGVuZHM9InppcHMsdGVzdCxjb3B5Ii8+Ci0JPHRhcmdldCBuYW1lPSJidWlsZGNvcHkiIGRlcGVuZHM9InppcHMsY29weSIvPgotCQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0b3VjaCBmaWxlPSIke3VzZXIuaG9tZX0vLmN2c3Bhc3MiIC8+Ci0JCTx0c3RhbXAvPgotCQk8cHJvcGVydHkgbmFtZT0iZWNsaXBzZURpc3QiIHZhbHVlPSIvaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvZG93bmxvYWRzL2Ryb3BzL1ItMy41LTIwMDkwNjExMTU0MC9lY2xpcHNlLVNESy0zLjUtbGludXgtZ3RrLXBwYy50YXIuZ3oiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNkdERpc3QiIHZhbHVlPSIvaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL2NkdC9idWlsZHMvNi4wLjEvSS5JMjAwOTA5MTEwNjA4L2NkdC1tYXN0ZXItNi4wLjEtSTIwMDkwOTExMDYwOC56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im15bHluRGlzdCIgdmFsdWU9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvbXlseW4vdXBkYXRlL2dhbGlsZW8vbXlseW4tMy4yLjAudjIwMDkwNjE3LTAxMDAtZTMuNC56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJzZURpc3QiIHZhbHVlPSIvaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2RzZHAvdG0vZG93bmxvYWRzL2Ryb3BzL1ItMy4xLTIwMDkwNjE3MTQwMC9SU0UtU0RLLTMuMS56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhdUphcnMiIHZhbHVlPSIke3VzZXIuaG9tZX0vdGF1X2phcnMuemlwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlUmVsZWFzZSIgdmFsdWU9ImdhbGlsZW8iLz4KLQkJPHByb3BlcnR5IG5hbWU9InB0cEJyYW5jaFZlcnNpb24iIHZhbHVlPSIzLjAuMCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGhvdHJhbkJyYW5jaFZlcnNpb24iIHZhbHVlPSI1LjAuMCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGltZXN0YW1wIiB2YWx1ZT0iJHtEU1RBTVB9JHtUU1RBTVB9IiAvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9yY2VDb250ZXh0UXVhbGlmaWVyIiB2YWx1ZT0iJHt0aW1lc3RhbXB9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZGluZ09TR2kiIHZhbHVlPSJ0cnVlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZERpcmVjdG9yeSIgdmFsdWU9IiR7YmFzZWRpcn0vcmVzdWx0cyIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29weVRvRGlyIiB2YWx1ZT0iL2hvbWUvd3d3L3Rvb2xzL3B0cC9idWlsZHMvJHtlY2xpcHNlUmVsZWFzZX0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRlc3REaXJlY3RvcnkiIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS90ZXN0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYXNlTG9jYXRpb24iIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS9lY2xpcHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwZGUuYnVpbGQuc2NyaXB0cyIgdmFsdWU9IiR7ZWNsaXBzZS5wZGVidWlsZC5zY3JpcHRzfSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29sbGVjdGluZ0ZvbGRlciIgdmFsdWU9ImVjbGlwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImFyY2hpdmVQcmVmaXgiIHZhbHVlPSJlY2xpcHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZFR5cGUiIHZhbHVlPSJJIiAvPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGRJZCIgdmFsdWU9IiR7YnVpbGRUeXBlfSR7dGltZXN0YW1wfSIvPgotCQk8cHJvcGVydHkgbmFtZT0iemlwc2RpciIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwdHBNYXN0ZXJGaWxlIiB2YWx1ZT0icHRwLW1hc3Rlci0ke3B0cEJyYW5jaFZlcnNpb259LSR7YnVpbGRJZH0uemlwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaG90cmFuTWFzdGVyRmlsZSIgdmFsdWU9InBob3RyYW4tbWFzdGVyLSR7cGhvdHJhbkJyYW5jaFZlcnNpb259LSR7YnVpbGRJZH0uemlwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlVGVzdCIgdmFsdWU9Im9yZy5lY2xpcHNlLnRlc3RfMy4yLjAiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1haWx0byIgdmFsdWU9Imcud2F0c29uQGNvbXB1dGVyLm9yZyIvPgotCQk8cHJvcGVydHkgbmFtZT0iZWNsaXBzZVJvb3QiIHZhbHVlPSI6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhc2VvcyIgdmFsdWU9IiR7b3NnaS5vc30iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhc2V3cyIgdmFsdWU9IiR7b3NnaS53c30iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhc2VhcmNoIiB2YWx1ZT0iJHtvc2dpLmFyY2h9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YWdicmFuY2giIHZhbHVlPSIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhZ25hbWUiIHZhbHVlPSJ2JHt0aW1lc3RhbXB9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXN0UmVwb3J0cyIgdmFsdWU9IiR7emlwc2Rpcn0vdGVzdFJlcG9ydHMiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imp1bml0LXJlcG9ydC1vdXRwdXQiIHZhbHVlPSIke3Rlc3RSZXBvcnRzfSIvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJvbldpbmRvd3MiPgotCQkJPG9zIGZhbWlseT0id2luZG93cyIvPgotCQk8L2NvbmRpdGlvbj4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZXN0UmVwb3J0c30iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImZldGNoIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGRpcj0iJHtwZGUuYnVpbGQuc2NyaXB0c30iIHRhcmdldD0icHJlQnVpbGQiPgotCQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L21hc3RlciIvPgotCQk8L2FudD4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGRpcj0iJHtwZGUuYnVpbGQuc2NyaXB0c30iIHRhcmdldD0iZmV0Y2giPgotCQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L21hc3RlciIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InVuemlwIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImRvbnRVbnppcCI+Ci0JCTx1bnRhciBzcmM9IiR7ZWNsaXBzZURpc3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fSIgY29tcHJlc3Npb249Imd6aXAiLz4KLQkJPHVuemlwIHNyYz0iJHtyc2VEaXN0fSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0iLz4KLQkJPHVuemlwIHNyYz0iJHtjZHREaXN0fSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZSIvPgotCQk8dW56aXAgc3JjPSIke215bHluRGlzdH0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L2VjbGlwc2UiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InppcHMiIGRlcGVuZHM9ImluaXQsdW56aXAiPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgZGlyPSIke3BkZS5idWlsZC5zY3JpcHRzfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYnVpbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vbWFzdGVyIiAvPgotCQk8L2FudD4KLQkJPGNvbmNhdCBkZXN0ZmlsZT0iJHt6aXBzZGlyfS9jb21waWxlbG9nLnR4dCI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMiIGluY2x1ZGVzPSIqKi8qLmJpbi5sb2ciLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucyIgaW5jbHVkZXM9IioqLypAZG90LmxvZyIvPgotCQk8L2NvbmNhdD4KLQkJPGxvYWRmaWxlIHByb3BlcnR5PSJjb21waWxlTG9nIiBzcmNGaWxlPSIke3ppcHNkaXJ9L2NvbXBpbGVsb2cudHh0Ii8+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9Imhhc0Vycm9ycyI+Ci0JCQk8Y29udGFpbnMgc3RyaW5nPSIke2NvbXBpbGVMb2d9IiBzdWJzdHJpbmc9IiBFUlJPUiIvPgotCQk8L2NvbmRpdGlvbj4KLQkJPG1vdmUgZmlsZT0iJHt6aXBzZGlyfS8ke3B0cE1hc3RlckZpbGV9IiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0iLz4KLQkJPG1vdmUgZmlsZT0iJHt6aXBzZGlyfS8ke3Bob3RyYW5NYXN0ZXJGaWxlfSIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ii8+Ci0JCQotCQk8dW56aXAgc3JjPSIke2J1aWxkRGlyZWN0b3J5fS8ke3B0cE1hc3RlckZpbGV9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlIi8+Ci0JCTwhLS11bnppcCBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9LyR7cGhvdHJhbk1hc3RlckZpbGV9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlIi8tLT4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9lcGwtdjEwLmh0bWwiIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2UiLz4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9ub3RpY2UuaHRtbCIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUvZWNsaXBzZSIvPgotCQk8Y29weSBmaWxlPSJidWlsZHNpdGUueG1sIiB0b2ZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUvZWNsaXBzZS9zaXRlLnhtbCIvPgotCQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2Uvc2l0ZS54bWwiPgotCQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkB0aW1lU3RhbXBAIiB2YWx1ZT0iJHt0aW1lc3RhbXB9Ii8+Ci0JCTwvcmVwbGFjZT4KLQkJPGNvcHkgZmlsZT0icGFjay5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0vc2l0ZS9lY2xpcHNlIi8+Ci0KLQkJPHppcCBkZXN0ZmlsZT0iJHt6aXBzZGlyfS8ke3B0cE1hc3RlckZpbGV9IgotCQkJYmFzZWRpcj0iJHtidWlsZERpcmVjdG9yeX0vc2l0ZS9lY2xpcHNlIi8+Ci0JCQotCQk8IS0tCi0JCTx1bnppcCBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9LyR7cGhvdHJhbk1hc3RlckZpbGV9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9waG90cmFuX3NpdGUiLz4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9lcGwtdjEwLmh0bWwiIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9waG90cmFuX3NpdGUvZWNsaXBzZSIvPgotCQk8Y29weSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9lY2xpcHNlL25vdGljZS5odG1sIiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0vcGhvdHJhbl9zaXRlL2VjbGlwc2UiLz4KLQkJPGNvcHkgZmlsZT0icGhvdHJhbl9idWlsZHNpdGUueG1sIiB0b2ZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3Bob3RyYW5fc2l0ZS9lY2xpcHNlL3NpdGUueG1sIi8+Ci0JCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3Bob3RyYW5fc2l0ZS9lY2xpcHNlL3NpdGUueG1sIj4KLQkJCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAdGltZVN0YW1wQCIgdmFsdWU9IiR7dGltZXN0YW1wfSIvPgotCQk8L3JlcGxhY2U+Ci0JCTxjb3B5IGZpbGU9InBhY2sucHJvcGVydGllcyIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3Bob3RyYW5fc2l0ZS9lY2xpcHNlIi8+Ci0KLQkJPHppcCBkZXN0ZmlsZT0iJHt6aXBzZGlyfS8ke3Bob3RyYW5NYXN0ZXJGaWxlfSIKLQkJCWJhc2VkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3Bob3RyYW5fc2l0ZS9lY2xpcHNlIi8+Ci0JCS0tPgotCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InNpZ24iIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iaGFzRXJyb3JzIj4KLQkJPGV4ZWMgZXhlY3V0YWJsZT0ic2lnbiI+Ci0JCQk8YXJnIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfS8ke3B0cE1hc3RlckZpbGV9Ii8+Ci0JCQk8YXJnIHZhbHVlPSJub21haWwiLz4KLQkJCTxhcmcgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpZ25lZCIvPgotCQk8L2V4ZWM+Ci0JCTx3YWl0Zm9yIG1heHdhaXQ9IjMwIiBtYXh3YWl0dW5pdD0ibWludXRlIj4KLQkJCTxhdmFpbGFibGUgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vc2lnbmVkLyR7cHRwTWFzdGVyRmlsZX0iLz4KLQkJPC93YWl0Zm9yPgotCQk8bW92ZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9zaWduZWQvJHtwdHBNYXN0ZXJGaWxlfSIgdG9kaXI9IiR7emlwc2Rpcn0iLz4KLQkJPCEtLQotCQk8ZXhlYyBleGVjdXRhYmxlPSJzaWduIj4KLQkJCTxhcmcgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9LyR7cGhvdHJhbk1hc3RlckZpbGV9Ii8+Ci0JCQk8YXJnIHZhbHVlPSJub21haWwiLz4KLQkJCTxhcmcgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpZ25lZCIvPgotCQk8L2V4ZWM+Ci0JCTx3YWl0Zm9yIG1heHdhaXQ9IjMwIiBtYXh3YWl0dW5pdD0ibWludXRlIj4KLQkJCTxhdmFpbGFibGUgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vc2lnbmVkLyR7cGhvdHJhbk1hc3RlckZpbGV9Ii8+Ci0JCTwvd2FpdGZvcj4KLQkJPG1vdmUgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vc2lnbmVkLyR7cGhvdHJhbk1hc3RlckZpbGV9IiB0b2Rpcj0iJHt6aXBzZGlyfSIvPgotCQktLT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iaGFzRXJyb3JzIi8+Ci0JPHRhcmdldCBuYW1lPSJjb3B5IiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9Imhhc0Vycm9ycyI+Ci0JCTxta2RpciBkaXI9IiR7Y29weVRvRGlyfS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZFR5cGV9LiR7YnVpbGRJZH0iLz4KLQkJPC9jb3B5PgotCQk8IS0tIENyZWF0ZSBzeW1saW5rIHRvIGxhdGVzdCBidWlsZCAtLT4KLQkJPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7Y29weVRvRGlyfS9sYXRlc3QiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgotCQk8c3ltbGluayBsaW5rPSIke2NvcHlUb0Rpcn0vbGF0ZXN0IiByZXNvdXJjZT0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9IiBvdmVyd3JpdGU9InRydWUiLz4KLQkJPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7Y29weVRvRGlyfS9wdHAtbWFzdGVyLSR7cHRwQnJhbmNoVmVyc2lvbn0tbGF0ZXN0LnppcCIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Ci0JCTxzeW1saW5rIGxpbms9IiR7Y29weVRvRGlyfS9wdHAtbWFzdGVyLSR7cHRwQnJhbmNoVmVyc2lvbn0tbGF0ZXN0LnppcCIgcmVzb3VyY2U9IiR7Y29weVRvRGlyfS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfS8ke3B0cE1hc3RlckZpbGV9IiBvdmVyd3JpdGU9InRydWUiLz4KLQkJPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7Y29weVRvRGlyfS9yZHQtc2VydmVyLXVuaXgtMS4wLWxhdGVzdC50YXIiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgotCQk8c3ltbGluayBsaW5rPSIke2NvcHlUb0Rpcn0vcmR0LXNlcnZlci11bml4LTEuMC1sYXRlc3QudGFyIiByZXNvdXJjZT0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9L3JkdC1zZXJ2ZXItdW5peC0xLjAudGFyIiBvdmVyd3JpdGU9InRydWUiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InRhZ29uZSI+Ci0JCTxjdnMgY3Zzcm9vdD0iL2N2c3Jvb3QvdG9vbHMiIGNvbW1hbmQ9InJ0YWcgJHt0YWdicmFuY2h9ICR7dGFnbmFtZX0gJHt0YWdtb2R1bGV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJ0YWciIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFzdGVyIi8+Ci0JCTwvYW50Y2FsbD4KLQkJCi0JCTwhLS1GZWF0dXJlcy0tPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wZXJmLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LmZvcnRyYW4tZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJkdC1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJCi0JCTwhLS1QbHVnaW5zLS0+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5Ii8+Ci0JCTwvYW50Y2FsbD4JCQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscCIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLnByb3h5Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0Ii8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlciIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcyIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9kb2Mvb3JnLmVjbGlwc2UucHRwLmhlbHAiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHAiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMiLz4KLQkJPC9hbnRjYWxsPgkJCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcyIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuamFycyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGFwaXNlbGVjdCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGVyZmRtZiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuc2VsaW5zdCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuc2VsaW5zdGZvcnQiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudG9vbG9wdHMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUucmVtb3RlamFycyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5zdHVicyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuc2VydmljZXMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5kb2MudXNlciIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4NiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gueDg2Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnBhcmFsbGVsIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5wYXBpdGVzdCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuc2VydmljZXMudGVzdCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudGVzdCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNkdGludGVyZmFjZSIvPgotCQk8L2FudGNhbGw+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNkdGludGVyZmFjZS52cGciLz4KLSAgICAgICAgPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY29yZS5pbnRlbCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNvcmUudnBnIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uZXJyb3JwYXJzZXJzLnhsZiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmludGVsLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4ubWFuYWdlZGJ1aWxkZXIuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmdudS51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmludGVsLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4ubWFuYWdlZGJ1aWxkZXIudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLnhsZi51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4udWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLnVpLnZwZyIvPgotCQk8L2FudGNhbGw+CQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi54bGYtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9idWlsZHNpdGUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGRzaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2NzY1OC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9idWlsZHNpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlbyI+Ci0JCVBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIHVwZGF0ZSBzaXRlIC0gUmVsZWFzZSAzLjAKLQk8L2Rlc2NyaXB0aW9uPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIiBsYWJlbD0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHBfMy4wLjAuQHRpbWVTdGFtcEAuamFyIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5jb3JlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5jb3JlXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnV0aWxzXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGxfMy4wLjAuQHRpbWVTdGFtcEAuamFyIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZV8zLjAuMC5AdGltZVN0YW1wQC5qYXIiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZV8zLjAuMC5AdGltZVN0YW1wQC5qYXIiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGVfMy4wLjAuQHRpbWVTdGFtcEAuamFyIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMl8zLjAuMC5AdGltZVN0YW1wQC5qYXIiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGkiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGlfMy4wLjAuQHRpbWVTdGFtcEAuamFyIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5wbGR0XzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGlfMy4wLjAuQHRpbWVTdGFtcEAuamFyIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGNfMy4wLjAuQHRpbWVTdGFtcEAuamFyIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wZXJmIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5wZXJmXzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1XzMuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCQotCTxjYXRlZ29yeS1kZWYgbmFtZT0iUmVtb3RlIERldmVsb3BtZW50IFRvb2xzIiBsYWJlbD0iUmVtb3RlIERldmVsb3BtZW50IFRvb2xzIi8+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJkdF8zLjAuMC5AdGltZVN0YW1wQC5qYXIiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlJlbW90ZSBEZXZlbG9wbWVudCBUb29scyIvPgotCTwvZmVhdHVyZT4KLQkKLQk8Y2F0ZWdvcnktZGVmIG5hbWU9IkZvcnRyYW4gRGV2ZWxvcG1lbnQgVG9vbHMgKFBob3RyYW4pIiBsYWJlbD0iRm9ydHJhbiBEZXZlbG9wbWVudCBUb29scyAoUGhvdHJhbikiLz4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGhvdHJhbiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5waG90cmFuXzUuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iRm9ydHJhbiBEZXZlbG9wbWVudCBUb29scyAoUGhvdHJhbikiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWwiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbi5pbnRlbF81LjAuMC5AdGltZVN0YW1wQC5qYXIiIHZlcnNpb249IjUuMC4wLkB0aW1lU3RhbXBAIiBvcz0ibGludXgiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iRm9ydHJhbiBEZXZlbG9wbWVudCBUb29scyAoUGhvdHJhbikiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBob3RyYW4ueGxmIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBob3RyYW4ueGxmXzUuMC4wLkB0aW1lU3RhbXBALmphciIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iRm9ydHJhbiBEZXZlbG9wbWVudCBUb29scyAoUGhvdHJhbikiLz4KLQk8L2ZlYXR1cmU+PC9zaXRlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGRzaXRlX3JlbGVhc2UueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGRzaXRlX3JlbGVhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDBkYjMyLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkc2l0ZV9yZWxlYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8iPgotCQlQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSB1cGRhdGUgc2l0ZSAtIFJlbGVhc2UgMy4wCi0JPC9kZXNjcmlwdGlvbj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIgbGFiZWw9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cF8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLmNvcmVfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnV0aWxzIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAudXRpbHNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbCIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbF8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlXzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucnNlXzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0iIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG1fMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLmV4dGVybmFsIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWxfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZV8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyXzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waV8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdCIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnBsZHRfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaV8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwY18zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnBlcmZfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnBlcmYudGF1IiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXVfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQkKLQk8Y2F0ZWdvcnktZGVmIG5hbWU9IlJlbW90ZSBEZXZlbG9wbWVudCBUb29scyIgbGFiZWw9IlJlbW90ZSBEZXZlbG9wbWVudCBUb29scyIvPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0IiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmR0XzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgRGV2ZWxvcG1lbnQgVG9vbHMiLz4KLQk8L2ZlYXR1cmU+Ci0JCi0JPGNhdGVnb3J5LWRlZiBuYW1lPSJGb3J0cmFuIERldmVsb3BtZW50IFRvb2xzIChQaG90cmFuKSIgbGFiZWw9IkZvcnRyYW4gRGV2ZWxvcG1lbnQgVG9vbHMgKFBob3RyYW4pIi8+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBob3RyYW4iIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbl81LjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iRm9ydHJhbiBEZXZlbG9wbWVudCBUb29scyAoUGhvdHJhbikiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWwiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbi5pbnRlbF81LjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiIG9zPSJsaW51eCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJGb3J0cmFuIERldmVsb3BtZW50IFRvb2xzIChQaG90cmFuKSIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGhvdHJhbi54bGYiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbi54bGZfNS4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjUuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IkZvcnRyYW4gRGV2ZWxvcG1lbnQgVG9vbHMgKFBob3RyYW4pIi8+Ci0JPC9mZWF0dXJlPjwvc2l0ZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcGhvdHJhbi5tYXAgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXBzL3Bob3RyYW4ubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBlMzIyLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcGhvdHJhbi5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0hIE1hc3RlciBmZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnBob3RyYW4ubWFzdGVyPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hc3RlcgotCi0hIFBob3RyYW4gZmVhdHVyZXMKLWZlYXR1cmVAb3JnLmVjbGlwc2UucGhvdHJhbj1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnBob3RyYW4ueGxmPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLnhsZi1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWw9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWwtZmVhdHVyZQotCi0hIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLmNvcmU9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4ubWFuYWdlZGJ1aWxkZXIuY29yZT1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci51aT1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4uY2R0aW50ZXJmYWNlPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNkdGludGVyZmFjZQotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4udWk9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4udWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmdudS51aT1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci5nbnUudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLmNkdGludGVyZmFjZS52cGc9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY2R0aW50ZXJmYWNlLnZwZwotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4uY29yZS52cGc9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY29yZS52cGcKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLnVpLnZwZz1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi51aS52cGcKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmludGVsLnVpPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmludGVsLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucGhvdHJhbi5jb3JlLmludGVsPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNvcmUuaW50ZWwKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLmVycm9ycGFyc2Vycy54bGY9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uZXJyb3JwYXJzZXJzLnhsZgotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4ubWFuYWdlZGJ1aWxkZXIueGxmLnVpPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLnhsZi51aQotICAgICAgICAgCi0hIFRlc3RzCi0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcHRwLm1hcCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcHRwLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2YmFiZS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXBzL3B0cC5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotISBUaGUgbWFzdGVyCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5tYXN0ZXI9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFzdGVyCi0KLSEgUFRQIGZlYXR1cmVzCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC51dGlscz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucmVtb3RlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2U9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm09QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy1mZWF0dXJlCi0KLSEgUExEVCBmZWF0dXJlcwotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGxkdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZQotCi0hIFBURiBmZWF0dXJlcwotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGVyZj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wZXJmLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LmZvcnRyYW49QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuZm9ydHJhbi1mZWF0dXJlCi0KLSEgUkRUIGZlYXR1cmVzCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZHQ9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmR0LWZlYXR1cmUKLQotISBQVFAgUGx1Z2lucwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0uY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnByb3h5PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC51dGlscz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAubGF1bmNoPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuaGVscD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvZG9jL29yZy5lY2xpcHNlLnB0cC5oZWxwCi0KLSEgU2VydmljZXMgUGx1Z2lucwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aQotCi0hIFJlbW90ZSBUb29scyBQbHVnaW5zCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXI9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlcgotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscwotCi0hIFBMRFQgUGx1Z2lucwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQuaGVscD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQuaGVscAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQ9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQudXBjPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzCi0KLSEgRVRGIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGVyZj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZgotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuamFycz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuamFycwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5wYXBpc2VsZWN0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5wYXBpc2VsZWN0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBlcmZkbWY9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBlcmZkbWYKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuc2VsaW5zdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuc2VsaW5zdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0Zm9ydD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuc2VsaW5zdGZvcnQKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGVyZi50b29sb3B0cz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50b29sb3B0cwotCi0hIFJEVCBQbHVnaW5zCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJkdC51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0LnNlcnZpY2VzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5zZXJ2aWNlcwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZHQuZG9jLnVzZXI9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmRvYy51c2VyCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aQotCi0hIEZyYWdtZW50cwotZnJhZ21lbnRAb3JnLmVjbGlwc2UucHRwLmFpeC5wcGM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYwotZnJhZ21lbnRAb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMKLWZyYWdtZW50QG9yZy5lY2xpcHNlLnB0cC5saW51eC54ODY9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2Ci1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NAotZnJhZ21lbnRAb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYwotZnJhZ21lbnRAb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODY9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4NgotZnJhZ21lbnRAb3JnLmVjbGlwc2UucHRwLnBlcmYucGFyYWxsZWw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYucGFyYWxsZWwKLQotISBUZXN0cwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5wYXBpdGVzdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGFwaXRlc3QKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHMKLQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvbWFzdGVyL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXN0ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZDJlNi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXN0ZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGFyYW1ldGVycyBkZXNjcmliaW5nIGhvdyBhbmQgd2hlcmUgdG8gZXhlY3V0ZSB0aGUgYnVpbGQuCi0jIFR5cGljYWwgdXNlcnMgbmVlZCBvbmx5IHVwZGF0ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0jICAgIGJhc2VMb2NhdGlvbiAtIHdoZXJlIHRoaW5ncyB5b3UgYXJlIGJ1aWxkaW5nIGFnYWluc3QgYXJlIGluc3RhbGxlZAotIyAgICBib290Y2xhc3NwYXRoIC0gVGhlIGJhc2UgamFycyB0byBjb21waWxlIGFnYWluc3QgKHR5cGljYWx5IHJ0LmphcikKLSMgICAgY29uZmlncyAtIHRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgCi0jCi0jIE9mIGNvdXJzZSBhbnkgb2YgdGhlIHNldHRpbmdzIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlYydpbmcgCi0jIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSAoZS5nLiwgLURiYXNlTG9jYXRpb249ZDovZWNsaXBzZQotCi0jIyMjIyMjIyMjIyMjIENWUyBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIENWUyB0YWcgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgdGhlIG1hcCBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5Ci1tYXBWZXJzaW9uVGFnPUhFQUQKLQotIyBUaGUgQ1ZTIHRhZyB0byB1c2Ugd2hlbiBmZXRjaGluZyBlbGVtZW50cyB0byBidWlsZC4gIEJ5IGRlZmF1bHQgdGhlCi0jIGJ1aWxkZXIgd2lsbCB1c2Ugd2hhdGV2ZXIgaXMgaW4gdGhlIG1hcHMuICBVc2UgdGhpcyB2YWx1ZSB0byBvdmVycmlkZQotIyBmb3IgZXhhbXBsZSwgd2hlbiBkb2luZyBhIG5pZ2h0bHkgYnVpbGQgb3V0IG9mIEhFQUQKLSMgZmV0Y2hUYWc9SEVBRAotCi1wdHBUYWc9SEVBRAotcGhvdHJhblRhZz1IRUFECi0KLSMjIyMjIyMjIyMjIyMjIEJVSUxEIC8gR0VORVJBVElPTiBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBidWlsZCBlbGVtZW50cyB3aWxsIGJlIGZldGNoZWQgYW5kIHdoZXJlCi0jIHRoZSBidWlsZCB3aWxsIHRha2UgcGxhY2UuICBidWlsZERpcmVjdG9yeSBhbmQgaW5zdGFsbCBzaG91bGQgYmUgdGhlIHNhbWUKLSMgdmFsdWUuCi1idWlsZERpcmVjdG9yeT1idWlsZAotCi0jIFR5cGUgb2YgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LiAgVHlwaWNhbGx5IHRoaXMgdmFsdWUgaXMKLSMgb25lIG9mIEksIE4sIE0sIFMsIC4uLgotYnVpbGRUeXBlPUkKLQotIyBJRCBvZiB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LgotYnVpbGRJZD1UZXN0QnVpbGQKLQotIyBMYWJlbCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotYnVpbGRMYWJlbD0ke2J1aWxkVHlwZX0uJHtidWlsZElkfQotCi0jIFRpbWVzdGFtcCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotdGltZXN0YW1wPTAwNwotCi0jIEJhc2UgbG9jYXRpb24gZm9yIGFueXRoaW5nIHRoZSBidWlsZCBuZWVkcyB0byBjb21waWxlIGFnYWluc3QuICBGb3IgZXhhbXBsZSwKLSMgd2hlbiBidWlsZGluZyBHRUYsIHRoZSBiYXNlTG9jYXRpb24gc2hvdWxkIGJlIHRoZSBsb2NhdGlvbiBvZiBhIHByZXZpb3VzbHkKLSMgaW5zdGFsbGVkIEVjbGlwc2UgYWdhaW5zdCB3aGljaCB0aGUgR0VGIGNvZGUgd2lsbCBiZSBjb21waWxlZC4KLWJhc2VMb2NhdGlvbj0KLQotI09zL1dzL0FyY2gvbmwgb2YgdGhlIGVjbGlwc2Ugc3BlY2lmaWVkIGJ5IGJhc2VMb2NhdGlvbgotI2Jhc2VvcwotI2Jhc2V3cwotI2Jhc2VhcmNoCi0jYmFzZW5sCi0KLSMgVGhlIGxvY2F0aW9uIHVuZGVyd2hpY2ggYWxsIG9mIHRoZSBidWlsZCBvdXRwdXQgd2lsbCBiZSBjb2xsZWN0ZWQuICBUaGlzIHdpbGwgYmUKLSMgdGhlIHJvb3QgcGF0aCBpbiB0aGUgcmVzdWx0YW50IHppcCBmaWxlLgotY29sbFBsYWNlPWVjbGlwc2UKLQotIyBUaGUgZGlyZWN0b3J5ICBpbiB3aGljaCB0byBleGVjdXRlIHppcCBvZiB0aGUgJHtjb2xsUGxhY2V9IGRpcmVjdG9yeQotY29sbEJhc2U9LgotCi0jIFRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgVGhpcyAKLSMgdmFsdWUgaXMgYSAnJicgc2VwYXJhdGVkIGxpc3Qgb2YgJywnIHNlcGFyYXRlIHRyaXBsZXMuICBGb3IgZXhhbXBsZSwgCi0jICAgICBjb25maWdzPXdpbjMyLHdpbjMyLHg4NiAmIGxpbnV4LG1vdGlmLHg4NgotIyBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyAqLCosKgotY29uZmlncz0gXAotCSAgYWl4LG1vdGlmLHBwYyBcCi0gICAgJiBsaW51eCxndGsseDg2IFwKLSAgICAmIGxpbnV4LGd0ayx4ODZfNjQgXAotICAgICYgbGludXgsZ3RrLHBwYyBcCi0gICAgJiBtYWNvc3gsY2FyYm9uLHBwYyBcCi0gICAgJiB3aW4zMix3aW4zMix4ODYKLQotb3V0cHV0VXBkYXRlSmFycz10cnVlCi1ncm91cENvbmZpZ3VyYXRpb25zPXRydWUKLQotI0FyZ3VtZW50cyB0byBzZW5kIHRvIHRoZSB6aXAgZXhlY3V0YWJsZQotemlwYXJncz0KLQotIyMjIyMjIyMjIyMjIyBKQVZBIENPTVBJTEVSIE9QVElPTlMgIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGxvY2F0aW9uIG9mIHRoZSBKYXZhIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0LiAgVHlwaWNhbGx5IHRoZSBydC5qYXIgZm9yIHlvdXIgSkRLL0pSRQotI2Jvb3RjbGFzc3BhdGg9ZDovaWJtMS4zLjEvanJlL2xpYi9ydC5qYXIKLQotamF2YWNEZWJ1Z0luZm89b24KLWphdmFjVmVyYm9zZT10cnVlCi1qYXZhY0ZhaWxPbkVycm9yPWZhbHNlCi0KLSMgVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCi1qYXZhY1NvdXJjZT0xLjUKLQotIyBUaGUgdmVyc2lvbiBvZiB0aGUgYnl0ZSBjb2RlIHRhcmdldGVkCi1qYXZhY1RhcmdldD0xLjUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9jdXN0b21UYXJnZXRzLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9jdXN0b21UYXJnZXRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4Njg4MC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXN0ZXIvY3VzdG9tVGFyZ2V0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0IiA+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0IC0tPgotPCEtLSBBZGQgb24gPGFudD4gdGFzayBmb3IgZWFjaCB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdC4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHMiPgotCTxhbnQgYW50ZmlsZT0iJHtnZW5lcmljVGFyZ2V0c30iIHRhcmdldD0iJHt0YXJnZXR9Ij4KLQkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJmZWF0dXJlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC5tYXN0ZXIiLz4KLQk8L2FudD4KLQk8YW50IGFudGZpbGU9IiR7Z2VuZXJpY1RhcmdldHN9IiB0YXJnZXQ9IiR7dGFyZ2V0fSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmVhdHVyZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5waG90cmFuLm1hc3RlciIvPgotCTwvYW50PgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUYXJnZXRzIHRvIGFzc2VtYmxlIHRoZSBidWlsdCBlbGVtZW50cyBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9ucyAgLS0+Ci08IS0tIFRoZXNlIGdlbmVyYWxseSBjYWxsIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibGUgc2NyaXB0cyAobmFtZWQgaW4gLS0+Ci08IS0tICR7YXNzZW1ibGVTY3JpcHROYW1lfSkgYnV0IG1heSBhbHNvIGFkZCBwcmUgYW5kIHBvc3QgcHJvY2Vzc2luZyAtLT4KLTwhLS0gQWRkIG9uZSB0YXJnZXQgZm9yIGVhY2ggcm9vdCBlbGVtZW50IGFuZCBlYWNoIGNvbmZpZ3VyYXRpb24gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5vcmcuZWNsaXBzZS5wdHAubWFzdGVyLmdyb3VwLmdyb3VwLmdyb3VwIj4KLQk8YW50IGFudGZpbGU9IiR7YXNzZW1ibGVTY3JpcHROYW1lfSIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhcmNoaXZlTmFtZSIgdmFsdWU9InB0cC1tYXN0ZXItJHtwdHBCcmFuY2hWZXJzaW9ufS0ke2J1aWxkSWR9LnppcCIvPgotCTwvYW50PgotPC90YXJnZXQ+Ci0JCi08dGFyZ2V0IG5hbWU9ImFzc2VtYmxlLm9yZy5lY2xpcHNlLnBob3RyYW4ubWFzdGVyLmdyb3VwLmdyb3VwLmdyb3VwIj4KLQk8YW50IGFudGZpbGU9IiR7YXNzZW1ibGVTY3JpcHROYW1lfSIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhcmNoaXZlTmFtZSIgdmFsdWU9InBob3RyYW4tbWFzdGVyLSR7cGhvdHJhbkJyYW5jaFZlcnNpb259LSR7YnVpbGRJZH0uemlwIi8+Ci0JPC9hbnQ+Ci08L3RhcmdldD4KLQkKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDaGVjayBvdXQgbWFwIGZpbGVzIGZyb20gY29ycmVjdCByZXBvc2l0b3J5IC0tPgotPCEtLSBSZXBsYWNlIHZhbHVlcyBmb3IgY3ZzUm9vdCwgcGFja2FnZSBhbmQgbWFwVmVyc2lvblRhZyBhcyBkZXNpcmVkLiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJnZXRNYXBGaWxlcyI+Ci0JPGNvcHkgZmlsZT0iJHtidWlsZGVyfS8uLi9tYXBzL3B0cC5tYXAiIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIi8+Ci0JPHJlcGxhY2UgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vbWFwcy9wdHAubWFwIj4KLQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBwdHBUYWdAIiB2YWx1ZT0iJHtwdHBUYWd9Ii8+Ci0JPC9yZXBsYWNlPgotCTxjb3B5IGZpbGU9IiR7YnVpbGRlcn0vLi4vbWFwcy9waG90cmFuLm1hcCIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMiLz4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzL3Bob3RyYW4ubWFwIj4KLQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBwaG90cmFuVGFnQCIgdmFsdWU9IiR7cGhvdHJhblRhZ30iLz4KLQk8L3JlcGxhY2U+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBzZXR1cCAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwcmVTZXR1cCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHNldHVwIGJ1dCBiZWZvcmUgc3RhcnRpbmcgdGhlIGJ1aWxkIHByb3BlciAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwb3N0U2V0dXAiPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InByZUZldGNoIj4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RGZXRjaCI+Ci0JPGNvbmRpdGlvbiBwcm9wZXJ0eT0icGF0Y2hlc0F2YWlsYWJsZSI+Ci0JCTxhdmFpbGFibGUgZmlsZT0iJHtidWlsZGVyfS9wYXRjaC54bWwiLz4KLQk8L2NvbmRpdGlvbj4KLQk8YW50Y2FsbCB0YXJnZXQ9ImFwcGx5UGF0Y2hlcyIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iYXBwbHlQYXRjaGVzIiBpZj0icGF0Y2hlc0F2YWlsYWJsZSI+Ci0JPGFudCBhbnRmaWxlPSIke2J1aWxkZXJ9L3BhdGNoLnhtbCIvPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgYnVpbGQgc2NyaXB0cy4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHJlR2VuZXJhdGUiPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwb3N0R2VuZXJhdGUiPgotPC90YXJnZXQ+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InByZVByb2Nlc3MiPgotCTxyZXBsYWNlIGRpcj0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucyIgdmFsdWU9IiR7dGltZXN0YW1wfSIgdG9rZW49IkBidWlsZEAiPgotCQk8aW5jbHVkZSBuYW1lPSIqKi9hYm91dC5tYXBwaW5ncyIgLz4KLQk8L3JlcGxhY2U+Ci0JPHVuemlwIHNyYz0iJHt0YXVKYXJzfSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuamFycyIvPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke3B0cEJyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke3B0cEJyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke3B0cEJyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke3B0cEJyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL0JVSUxEIj4KLQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBidWlsZFZlcnNpb25AIiB2YWx1ZT0iJHtwdHBCcmFuY2hWZXJzaW9ufS4ke3RpbWVzdGFtcH0iLz4KLQk8L3JlcGxhY2U+Ci0JPHJlcGxhY2UgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9CVUlMRCI+Ci0JCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAYnVpbGRWZXJzaW9uQCIgdmFsdWU9IiR7cHRwQnJhbmNoVmVyc2lvbn0uJHt0aW1lc3RhbXB9Ii8+Ci0JPC9yZXBsYWNlPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RQcm9jZXNzIj4KLTwvdGFyZ2V0PgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHJlQXNzZW1ibGUiPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icG9zdEFzc2VtYmxlIj4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIGJ1aWxkIGlzIGRvbmUuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RCdWlsZCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIHRvIHRlc3QgdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0idGVzdCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIHRvIHB1Ymxpc2ggdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHVibGlzaCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCTxlY2hvIG1lc3NhZ2U9IllvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2hlbiBpbnZva2luZyB0aGlzIGZpbGUiIC8+Ci08L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGFjay5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGFjay5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2I1YTVlLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3BhY2sucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBhY2syMDAuZGVmYXVsdC5hcmdzPS1FNApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGhvdHJhbl9idWlsZHNpdGUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGhvdHJhbl9idWlsZHNpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTNlOTAyLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3Bob3RyYW5fYnVpbGRzaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLQk8ZGVzY3JpcHRpb24+Ci0JCVBob3RyYW4gKEZvcnRyYW4gRGV2ZWxvcG1lbnQgVG9vbHMpCi0JPC9kZXNjcmlwdGlvbj4KLSAgIAk8Y2F0ZWdvcnktZGVmIG5hbWU9IlBob3RyYW4gQmFzZSBEaXN0cmlidXRpb24iIGxhYmVsPSJQaG90cmFuIChGb3J0cmFuIERldmVsb3BtZW50IFRvb2xzKSIvPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iRm9ydHJhbiBDb21waWxlciBTdXBwb3J0IiBsYWJlbD0iRm9ydHJhbiBDb21waWxlciBTdXBwb3J0Ij4KLQkJPGRlc2NyaXB0aW9uPgotCQkJT3B0aW9uYWwgZmVhdHVyZXMgYWRkaW5nIGVycm9yIHBhcnNlcnMgYW5kIG1hbmFnZWQgYnVpbGQgdG9vbGNoYWlucyBmb3IgdmFyaW91cyB2ZW5kb3JzJmFwb3M7IEZvcnRyYW4gY29tcGlsZXJzCi0JCTwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBob3RyYW4iIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbl81LjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGhvdHJhbiBCYXNlIERpc3RyaWJ1dGlvbiIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGhvdHJhbi5pbnRlbCIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3Bob3RyYW4vcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5waG90cmFuLmludGVsXzUuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSI1LjAuMC5AdGltZVN0YW1wQCIgb3M9ImxpbnV4Ij4KLQkJPGNhdGVnb3J5IG5hbWU9IkZvcnRyYW4gQ29tcGlsZXIgU3VwcG9ydCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGhvdHJhbi54bGYiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbi54bGZfNS4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjUuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IkZvcnRyYW4gQ29tcGlsZXIgU3VwcG9ydCIvPgotCTwvZmVhdHVyZT4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3B0cGJ1aWxkIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcHRwYnVpbGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzQ2ZjcuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcHRwYnVpbGQKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgcHRwYnVpbGQgd3JhcHBlciBzY3JpcHQKLSMKLSMgVXNhZ2U6IHB0cGJ1aWxkIFstdCB0YWddIFstZCBidWlsZF9kaXJdIFtidWlsZF9hcmdzXQotIwotIyB3aGVyZQotIwotIyB0YWcgaXMgdGhlIENWUyB0YWcgdXNlZCB0byBjaGVjayBvdXQgdGhlIHJlbGVuZyBwcm9qZWN0IChkZWZhdWx0IEhFQUQpCi0jIGJ1aWxkX2RpciBpcyB0aGUgbG9jYXRpb24gdGhhdCB0aGUgYnVpbGQgd2lsbCB0YWtlIHBsYWNlCi0jIGJ1aWxkX2FyZ3MgYXJlIGFueSBhcmd1bWVudHMgeW91IHdhbnQgdG8gcGFzcyB0byB0aGUgYnVpbGQgc2NyaXB0Ci0jCi0jIHNldCB1cCBhbnl0aGluZyBlbnZpcm9ubWVudCBzcGVjaWZpYyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlCi0jIGxhdW5jaGluZyB0aGUgYnVpbGQgc2NyaXB0IGluIHRoZSByZWxlbmcgcHJvamVjdAotCi1MQU5HPWVuX1VTCi1UQUc9SEVBRAotQ0RUX1RBRz1IRUFECi0KLSMgbWFpbiBzdGFnaW5nIGRpcmVjdG9yeQotQlVJTERfRElSPS9vcHQvcHVibGljL2Rvd25sb2FkLXN0YWdpbmcucHJpdi90b29scy9wdHAvcmVsZW5nCi0KLWFyZ3M9YGdldG9wdCBkOnQ6ICQqYAotCi1pZiBbICQ/ICE9IDAgXTsgdGhlbgotCWVjaG8gInVzYWdlOiBwdHBidWlsZCBbLXQgdGFnXSBbLWMgY2R0X3RhZ10gWy1kIGJ1aWxkX2Rpcl0gW2J1aWxkX2FyZ3NdIgotCWV4aXQgMQotZmkKLQotc2V0IC0tICRhcmdzCi1mb3IgaQotZG8KLQljYXNlICIkaSIKLQlpbgotCS1jKSBDRFRfVEFHPSIkMiI7IHNoaWZ0OyBzaGlmdDs7Ci0JLWQpIEJVSUxEX0RJUj0iJDIiOyBzaGlmdDsgc2hpZnQ7OwotCS10KSBUQUc9IiQyIjsgc2hpZnQ7IHNoaWZ0OzsKLQktLSkgc2hpZnQ7IGJyZWFrOzsKLQllc2FjCi1kb25lCi0KLUJVSUxEX0xPRz0kQlVJTERfRElSL3B0cGJ1aWxkXyR7VEFHfV9gZGF0ZSArJVklbSVkJUglTWAubG9nCi0KLXsKLSMgY3JlYXRlIHRoZSByZWxlbmcgc3RhZ2luZyBkaXJlY3RvcnkgYW5kIGdvIHRoZXJlCi1ta2RpciAtcCAkQlVJTERfRElSICYmIGNkICRCVUlMRF9ESVIKLQotIyByZW1vdmUgdGhlIG9sZCBidWlsZAotcm0gLWZyIG9yZy5lY2xpcHNlLnB0cAotCi0jIENoZWNrIG91dCB0aGUgcmVsZW5nIHByb2plY3QKLWV4cG9ydCBDVlNST09UPTpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMKLWN2cyBjbyAtciAkVEFHIC1kIG9yZy5lY2xpcHNlLnB0cCBvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcKLQotIyBydW4gdGhlIG1haW4gc2NyaXB0Ci1jZCBvcmcuZWNsaXBzZS5wdHAKLXNoIGJ1aWxkLnNoICQqCi0KLSMgQnVpbGQgUkRUIHNlcnZlciBwYWNrYWdlcwotY2QgcmVzdWx0cy9wbHVnaW5zCi0KLSMgQ2hlY2sgb3V0IHJkdC5jb3JlLnJlbW90ZWphcnMsIHJkdC5jb3JlLnN0dWJzIGFuZCBjZHQuY29yZSBmb3Igc291cmNlCi1leHBvcnQgQ1ZTUk9PVD06cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzCi1jdnMgY28gLXIgJFRBRyAtZCBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUucmVtb3RlamFycyBvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzCi1jdnMgY28gLXIgJFRBRyAtZCBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUuc3R1YnMgb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUuc3R1YnMKLWN2cyBjbyAtciAkQ0RUX1RBRyAtZCBvcmcuZWNsaXBzZS5jZHQuY29yZSBvcmcuZWNsaXBzZS5jZHQvYWxsL29yZy5lY2xpcHNlLmNkdC5jb3JlCi0KLWNkIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzCi0KLSMgcnVuIHRoZSBzY3JpcHQgaW4gcmVtb3RlamFycwotZXhwb3J0IFBBVEg9L29wdC9wdWJsaWMvY29tbW9uL2libS1qYXZhMi1wcGMtNTAvYmluOiRQQVRICi1lY2hvIGBqYXZhIC12ZXJzaW9uYAotamF2YSAtamFyIC4uLy4uLy4uL3Rvb2xzL29yZy5lY2xpcHNlLnJlbGVuZy5iYXNlYnVpbGRlci9wbHVnaW5zL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuamFyIFwKLQktd3MgZ3RrIC1hcmNoIHBwYyAtb3MgbGludXggLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFJ1bm5lcgotCi19ID4kQlVJTERfTE9HIDI+JjEKLQotaWYgZ3JlcCAtcSAnQlVJTEQgRkFJTEVEJyAkQlVJTERfTE9HOyB0aGVuCi0JZWNobyAiQlVJTEQgRkFJTEVELiBTZWUgJEJVSUxEX0xPRyBmb3IgZGV0YWlscy4iCi1maQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3VwZGF0ZV92ZXJzaW9ucyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3VwZGF0ZV92ZXJzaW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhYTMyOC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy91cGRhdGVfdmVyc2lvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgc2NyaXB0IHRvIHVwZGF0ZSBQVFAgdmVyc2lvbnMKLSMKLSMgVXNhZ2U6IHVwZGF0ZV92ZXJzaW9ucyB2ZXJzaW9uCi0jCi0jIHZlcnNpb24gLSBuZXcgdmVyc2lvbiBzdHJpbmcgKGUuZy4gIjMuMC4xIikKLSMKLSMgTm90ZTogYSAicXVhbGlmaWVyIiBzdWZmaXggd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIHRoZSB2ZXJzaW9uIHdoZXJlIGFwcHJvcHJpYXRlCi0jCi0KLVRNUF9ESVI9L3RtcAotCi1pZiBbICQjIC1sdCAxIF07IHRoZW4KLQllY2hvICJ1c2FnZTogdXBkYXRlX3ZlcnNpb25zIHZlcnNpb24iCi0JZXhpdCAxCi1maQotCi12ZXJzaW9uPSQxCi0KLUZFQVRVUkVTPSJcCi0Jb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5jb3JlLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5leHRlcm5hbC1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAubWFzdGVyIFwKLQlvcmcuZWNsaXBzZS5wdHAucGVyZi1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LmZvcnRyYW4tZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJkdC1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucmVtb3RlLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlIgotCQotUExVR0lOUz0iXAotCW9yZy5lY2xpcHNlLnB0cC5haXgucHBjIFwKLQlvcmcuZWNsaXBzZS5wdHAubGludXgucHBjIFwKLQlvcmcuZWNsaXBzZS5wdHAubGludXgueDg2IFwKLQlvcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0IFwKLQlvcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYyBcCi0Jb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYgXAotCW9yZy5lY2xpcHNlLnB0cCIKLQkKLUNfUFJPSkVDVFM9IlwKLQlvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIFwKLQlvcmcuZWNsaXBzZS5wdHAucHJveHkgXAotCW9yZy5lY2xpcHNlLnB0cC51dGlscyIKLQkKLXVwZGF0ZV9mZWF0dXJlKCkgewotCXNlZCAtZSAicy92ZXJzaW9uPVwiWzAtOV1cLlswLTldXC5bMC05XVwucXVhbGlmaWVyXCIvdmVyc2lvbj1cIiQyXC5xdWFsaWZpZXJcIi8iIDwgJDEvZmVhdHVyZS54bWwgPiAkVE1QX0RJUi8kezF9X2ZlYXR1cmUueG1sCi0JbXYgJFRNUF9ESVIvJHsxfV9mZWF0dXJlLnhtbCAkMS9mZWF0dXJlLnhtbAotfQotCi11cGRhdGVfbWFuaWZlc3QoKSB7Ci0Jc2VkIC1lICJzL0J1bmRsZS1WZXJzaW9uOiAqWzAtOV1cLlswLTldXC5bMC05XVwucXVhbGlmaWVyL0J1bmRsZS1WZXJzaW9uOiAkMi5xdWFsaWZpZXIvIiA8ICQxL01FVEEtSU5GL01BTklGRVNULk1GID4gJFRNUF9ESVIvJHsxfV9NQU5JRkVTVC5NRgotCW12ICRUTVBfRElSLyR7MX1fTUFOSUZFU1QuTUYgJDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKLX0KLQotdXBkYXRlX2NvbmZpZ3VyZSgpIHsKLQlzZWQgLWUgInMvQUNfSU5JVChcKFteLF0qXCksICpbMC05XVwuWzAtOV1cLlswLTldKS9BQ19JTklUKFwxLCAkMikvIiA8ICQxL2NvbmZpZ3VyZS5pbiA+ICRUTVBfRElSLyR7MX1fY29uZmlndXJlLmluCi0JbXYgJFRNUF9ESVIvJHsxfV9jb25maWd1cmUuaW4gJDEvY29uZmlndXJlLmluCi0JKGNkICQxOyBhdXRvY29uZikKLX0KLQotZm9yIGZlYXR1cmUgaW4gJEZFQVRVUkVTOyBkbwotCWVjaG8gIlVwZGF0aW5nICRmZWF0dXJlLi4uIgotCXVwZGF0ZV9mZWF0dXJlICRmZWF0dXJlICR2ZXJzaW9uCi1kb25lCi0KLWZvciBwbHVnaW4gaW4gJFBMVUdJTlM7IGRvCi0JZWNobyAiVXBkYXRpbmcgJHBsdWdpbi4uLiIKLQl1cGRhdGVfbWFuaWZlc3QgJHBsdWdpbiAkdmVyc2lvbgotZG9uZQotCi1mb3IgcHJvamVjdCBpbiAkQ19QUk9KRUNUUzsgZG8KLQllY2hvICJVcGRhdGluZyAkcHJvamVjdC4uLiIKLQl1cGRhdGVfbWFuaWZlc3QgJHByb2plY3QgJHZlcnNpb24KLQl1cGRhdGVfY29uZmlndXJlICRwcm9qZWN0ICR2ZXJzaW9uCi1kb25lCi0KLWVjaG8gIlVwZGF0aW5nIG9yZy5lY2xpcHNlLnB0cC5yZWxlbmcuLi4iCi1zZWQgLWUgInMvPHByb3BlcnR5IG5hbWU9XCJicmFuY2hWZXJzaW9uXCIgdmFsdWU9XCJbMC05XVwuWzAtOV1cLlswLTldXCJcLz4vPHByb3BlcnR5IG5hbWU9XCJicmFuY2hWZXJzaW9uXCIgdmFsdWU9XCIkdmVyc2lvblwiXC8+LyIgPCBvcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnhtbCA+ICRUTVBfRElSL29yZy5lY2xpcHNlLnB0cC5yZWxlbmdfYnVpbGQueG1sCi1tdiAkVE1QX0RJUi9vcmcuZWNsaXBzZS5wdHAucmVsZW5nX2J1aWxkLnhtbCBvcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnhtbAotCi1lY2hvICJVcGRhdGluZyBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUucmVtb3RlamFycy4uLiIKLXNlZCAtZSAicy88cHJvcGVydHkgbmFtZT1cInB0cFZlcnNpb25cIiB2YWx1ZT1cIlswLTldXC5bMC05XVwuWzAtOV1cIlwvPi88cHJvcGVydHkgbmFtZT1cInB0cFZlcnNpb25cIiB2YWx1ZT1cIiR2ZXJzaW9uXCJcLz4vIiA8IG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzL2J1aWxkLnhtbCA+ICRUTVBfRElSL29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzX2J1aWxkLnhtbAotbXYgJFRNUF9ESVIvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnNfYnVpbGQueG1sIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzL2J1aWxkLnhtbAotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFlYjdiLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4MTdiNC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBTdXBwb3J0IEZvciBJQk0gTG9hZExldmVsZXIKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgUFRQIFVwZGF0ZSBTaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BZGRzIHN1cHBvcnQgZm9yIHRoZSBJQk0gTG9hZExldmVsZXIKLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2Y2ZkMy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkiIHZlcnNpb249IjIuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDljZDguLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgdGhlIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudAotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNiODY0Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlbyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aSIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWNkNWIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIE1QSUNIMgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgTVBJQ0gyCi0KLSMgY29weXJpZ2h0Ci1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG5cCi1UaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNlxuXAotZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHlcblwKLW9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhc1xuXAotcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRVxuXAotR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SXG5cCi1BU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWRcblwKLXRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsXG5cCi1zbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuXG5cCi1cblwKLUFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotTEEtQ0MgMDQtMTE1XG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmVmMzY0Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlbyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM3ZDBlLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlkZjhmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwNTNlMC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QVFAgU3VwcG9ydCBGb3IgT3BlbiBNUEkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgUFRQIFVwZGF0ZSBTaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BZGRzIHN1cHBvcnQgZm9yIE9wZW4gTVBJCi0KLSMgY29weXJpZ2h0Ci1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyZGZkZi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLmNvcmUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4NGRlZC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZGY4Zi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yzg4N2YuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0jIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0jIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0jIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSMgCi0jIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBMQS1DQyAwNC0xMTUKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBTdXBwb3J0IEZvciBPcGVuIE1QSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgT3BlbiBNUEkKLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cblwKLVRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2XG5cCi1mb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eVxuXAotb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzXG5cCi1yaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFXG5cCi1HT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1JcblwKLUFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZFxuXAotdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCxcblwKLXNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC5cblwKLVxuXAotQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1MQS1DQyAwNC0xMTVcbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliMjUzMi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcnRlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51dGlscyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9ydGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLnByb3h5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBiNmVmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0ucGJzLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGE3N2IuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbA0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMtZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjJkNWUuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIg0KLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiDQoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPg0KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4NCi08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4NCi08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+DQotPGxpbmsgcmVsPUZpbGUtTGlzdA0KLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPg0KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPg0KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+DQotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPg0KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPg0KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPg0KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4NCi0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+DQotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPg0KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+DQotICAgPG86TGluZXM+Nzc8L286TGluZXM+DQotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+DQotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4NCi0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+DQotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+DQotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+DQotIDx3OldvcmREb2N1bWVudD4NCi0gIDx3OlRyYWNrUmV2aXNpb25zLz4NCi0gPC93OldvcmREb2N1bWVudD4NCi08L3htbD48IVtlbmRpZl0tLT4NCi08c3R5bGU+DQotPCEtLQ0KLSAvKiBGb250IERlZmluaXRpb25zICovDQotQGZvbnQtZmFjZQ0KLQl7Zm9udC1mYW1pbHk6VGFob21hOw0KLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsNCi0JbXNvLWZvbnQtY2hhcnNldDowOw0KLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsNCi0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7DQotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQ0KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwNCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7DQotCW1hcmdpbjowaW47DQotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCi0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOw0KLQlmb250LXNpemU6MTIuMHB0Ow0KLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsNCi0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQ0KLXANCi0Je21hcmdpbi1yaWdodDowaW47DQotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOw0KLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsNCi0JbWFyZ2luLWxlZnQ6MGluOw0KLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47DQotCWZvbnQtc2l6ZToxMi4wcHQ7DQotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOw0KLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dA0KLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7DQotCW1hcmdpbjowaW47DQotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCi0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOw0KLQlmb250LXNpemU6OC4wcHQ7DQotCWZvbnQtZmFtaWx5OlRhaG9tYTsNCi0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQ0KLUBwYWdlIFNlY3Rpb24xDQotCXtzaXplOjguNWluIDExLjBpbjsNCi0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47DQotCW1zby1oZWFkZXItbWFyZ2luOi41aW47DQotCW1zby1mb290ZXItbWFyZ2luOi41aW47DQotCW1zby1wYXBlci1zb3VyY2U6MDt9DQotZGl2LlNlY3Rpb24xDQotCXtwYWdlOlNlY3Rpb24xO30NCi0tLT4NCi08L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+DQotDQotPGRpdiBjbGFzcz1TZWN0aW9uMT4NCi0NCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+DQotPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVINCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLA0KLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQ0KLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpDQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24NCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+DQotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkNCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQ0KLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlDQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZA0KLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcg0KLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uDQotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlDQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uDQotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQ0KLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yDQotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50DQotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UNCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zDQotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobw0KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4NCi0NCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpDQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQNCi1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4NCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQ0KLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoDQotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlDQotZm9ybS48L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpDQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cw0KLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlDQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydA0KLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQ0KLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uDQotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQNCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbg0KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8NCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzDQotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpDQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cw0KLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yDQotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQ0KLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudA0KLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwNCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kDQotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkNCi10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLA0KLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUNCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlDQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkNCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodA0KLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4NCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4NCi0NCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUNCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+DQotPC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpDQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikNCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQ0KLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQNCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlDQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkNCi1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpDQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywNCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoDQotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkNCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0DQotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpDQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZA0KLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGENCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UNCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkNCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhDQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55DQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUNCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cw0KLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5DQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycw0KLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlDQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsDQotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbA0KLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlDQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbA0KLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyDQotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kDQotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcg0KLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvDQotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbg0KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0DQotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzDQotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyDQotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsDQotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3INCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZA0KLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlDQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQ0KLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGENCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQ0KLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQNCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcw0KLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQ0KLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGENCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUNCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+DQotDQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTDQotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVA0KLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsDQotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULA0KLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5DQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUNCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzDQotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLA0KLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yDQotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+DQotDQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTDQotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SDQotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTDQotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkNCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GDQotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRg0KLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+DQotDQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZA0KLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yDQotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0DQotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUNCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uDQotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQ0KLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgNCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gNCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlDQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50DQotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3INCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUNCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncw0KLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZA0KLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsDQotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5DQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQ0KLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcw0KLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudA0KLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZg0KLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzDQotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbA0KLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvDQotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uDQotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtDQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YNCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YNCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0NCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkDQotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bw0KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyDQotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdA0KLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlDQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZg0KLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcw0KLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMNCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPg0KLQ0KLTwvZGl2Pg0KLQ0KLTwvYm9keT4NCi0NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3ZmY3NS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0gIyBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSBTY2hvb2wgb2YgQ29tcHV0ZXIgU2NpZW5jZSxOYXRpb25hbCBVbml2ZXJzaXR5IA0KLSAjIG9mIERlZmVuc2UgVGVjaG5vbG9neSxDaGFuZ3NoYSxDaGluYS5BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0NCi0gIyBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiANCi0gIyB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLA0KLSAjIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gIyBDb250cmlidXRvcnM6DQotICMgTlVEVCBzY2hvb2wgb2YgY29tcHV0ZXIgLSA2MDUgc3RhZmYgcm9vbQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLQ0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUNCi1mZWF0dXJlTmFtZT1QVFAgU3VwcG9ydCBGb3IgUEJTDQotDQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUNCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQ0KLQ0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlDQotZGVzY3JpcHRpb249QWRkcyBzdXBwb3J0IGZvciBQQlMNCi0NCi0jIGNvcHlyaWdodA0KLWNvcHlyaWdodD1cDQotQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXA0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwNCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwNCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXA0KLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4NCi0NCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSINCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UNCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLQ0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiDQotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiDQotbGljZW5zZT1cDQotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cDQotTWFyY2ggMTcsIDIwMDVcblwNCi1cblwNCi1Vc2FnZSBPZiBDb250ZW50XG5cDQotXG5cDQotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXA0KLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXA0KLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXA0KLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXA0KLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwNCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cDQotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwNCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXA0KLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwNCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXA0KLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwNCi1cblwNCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cDQotXG5cDQotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwNCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXA0KLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cDQotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cDQotXG5cDQotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cDQotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cDQotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwNCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwNCi1cblwNCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cDQotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cDQotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXA0KLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXA0KLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXA0KLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cDQotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXA0KLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cDQotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cDQotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwNCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXA0KLVxuXA0KLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXA0KLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cDQotSW5jbHVkZWQgRmVhdHVyZXMuXG5cDQotXG5cDQotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXA0KLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXA0KLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cDQotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXA0KLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwNCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwNCi1cblwNCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXA0KLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwNCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwNCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwNCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwNCi1cblwNCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cDQotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwNCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwNCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXA0KLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cDQoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXA0KLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXA0KLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXA0KLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXA0KLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXA0KLVxuXA0KLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXA0KLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXA0KLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwNCi1cblwNCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwNCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwNCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cDQotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXA0KLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXA0KLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cDQotXG5cDQotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXA0KLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cDQotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwNCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cDQotXG5cDQotQ3J5cHRvZ3JhcGh5XG5cDQotXG5cDQotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cDQotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXA0KLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwNCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwNCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cDQotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cDQotXG5cDQotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4NCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmYmZjMC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLnBicyIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiIHZlcnNpb249IjIuMS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51aSIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnBicy1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWExMGNmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4NCi08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4NCi08cD5NYXJjaCAxNywgMjAwNTwvcD4NCi0NCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+DQotDQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTDQotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFDQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1INCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+DQotICAgDQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIA0KLSAgIA0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjANCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMNCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+DQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4NCi0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zDQotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+DQotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPg0KLTwvdWw+ICAgDQotIA0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kDQotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUNCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+DQotDQotPHVsPg0KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4NCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4NCi0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPg0KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPg0KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+DQotPC91bD4NCi0JCQ0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlDQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yDQotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLg0KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbg0KLXRoYXQgZGlyZWN0b3J5LjwvcD4NCi0NCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQ0KLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPg0KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JDQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+DQotPC91bD4NCi0NCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQ0KLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPg0KLQ0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPg0KLQ0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8NCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwNCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4NCi0gICANCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICANCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhZDNmNS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGE3N2IuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwNCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sDQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjJkNWUuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiDQoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCINCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+DQotDQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+DQotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50Pg0KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPg0KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4NCi08bGluayByZWw9RmlsZS1MaXN0DQotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+DQotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+DQotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+DQotIDxvOkRvY3VtZW50UHJvcGVydGllcz4NCi0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+DQotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+DQotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+DQotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPg0KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4NCi0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+DQotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4NCi0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4NCi0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4NCi0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPg0KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4NCi0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4NCi08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4NCi0gPHc6V29yZERvY3VtZW50Pg0KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPg0KLSA8L3c6V29yZERvY3VtZW50Pg0KLTwveG1sPjwhW2VuZGlmXS0tPg0KLTxzdHlsZT4NCi08IS0tDQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8NCi1AZm9udC1mYWNlDQotCXtmb250LWZhbWlseTpUYWhvbWE7DQotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0Ow0KLQltc28tZm9udC1jaGFyc2V0OjA7DQotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOw0KLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsNCi0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9DQotIC8qIFN0eWxlIERlZmluaXRpb25zICovDQotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsNCi0JbWFyZ2luOjBpbjsNCi0JbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47DQotCWZvbnQtc2l6ZToxMi4wcHQ7DQotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOw0KLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQotcA0KLQl7bWFyZ2luLXJpZ2h0OjBpbjsNCi0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87DQotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOw0KLQltYXJnaW4tbGVmdDowaW47DQotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsNCi0JZm9udC1zaXplOjEyLjBwdDsNCi0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7DQotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30NCi1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0DQotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsNCi0JbWFyZ2luOjBpbjsNCi0JbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47DQotCWZvbnQtc2l6ZTo4LjBwdDsNCi0JZm9udC1mYW1pbHk6VGFob21hOw0KLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQotQHBhZ2UgU2VjdGlvbjENCi0Je3NpemU6OC41aW4gMTEuMGluOw0KLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsNCi0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsNCi0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsNCi0JbXNvLXBhcGVyLXNvdXJjZTowO30NCi1kaXYuU2VjdGlvbjENCi0Je3BhZ2U6U2VjdGlvbjE7fQ0KLS0tPg0KLTwvc3R5bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4NCi0NCi08ZGl2IGNsYXNzPVNlY3Rpb24xPg0KLQ0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4NCi08L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUg0KLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsDQotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFDQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+DQotDQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkNCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbg0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4NCi1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQ0KLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpDQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUNCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkDQotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yDQotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24NCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUNCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24NCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlDQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3INCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQNCi1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQ0KLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMNCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvDQotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkNCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudA0KLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbg0KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5DQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gNCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUNCi1mb3JtLjwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikNCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzDQotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUNCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0DQotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlDQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24NCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZA0KLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uDQotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bw0KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMNCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykNCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzDQotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3INCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5DQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50DQotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbA0KLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQNCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQ0KLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsDQotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQ0KLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUNCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQ0KLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0DQotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbg0KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQ0KLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4NCi08L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkNCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQ0KLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpDQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZA0KLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUNCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQ0KLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkNCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLA0KLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gNCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQ0KLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQNCi1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikNCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kDQotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQ0KLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQ0KLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQ0KLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGENCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkNCi1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQ0KLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzDQotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+DQotDQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkNCi1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzDQotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UNCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwNCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsDQotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUNCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsDQotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXINCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQNCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyDQotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8NCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluDQotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QNCi1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMNCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXINCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwNCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcg0KLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kDQotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUNCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlDQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQ0KLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlDQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZA0KLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzDQotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlDQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQ0KLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQ0KLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4NCi0NCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMNCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUDQotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywNCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsDQotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkNCi1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQ0KLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMNCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsDQotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3INCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4NCi0NCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMNCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1INCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMNCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQ0KLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YNCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GDQotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4NCi0NCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkDQotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3INCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQNCi1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQ0KLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24NCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpDQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aA0KLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaA0KLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUNCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQNCi1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcg0KLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQ0KLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzDQotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kDQotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwNCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkNCi1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlDQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzDQotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50DQotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mDQotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMNCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsDQotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8NCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24NCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0NCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZg0KLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZg0KLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQ0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQNCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvDQotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXINCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90DQotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUNCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mDQotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzDQotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcw0KLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+DQotDQotPC9kaXY+DQotDQotPC9ib2R5Pg0KLQ0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhZDk4NC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSAjIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IFNjaG9vbCBvZiBDb21wdXRlciBTY2llbmNlLE5hdGlvbmFsIFVuaXZlcnNpdHkgDQotICMgb2YgRGVmZW5zZSBUZWNobm9sb2d5LENoYW5nc2hhLENoaW5hLkFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbQ0KLSAjIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIA0KLSAjIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sDQotICMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAjIENvbnRyaWJ1dG9yczoNCi0gIyBOVURUIHNjaG9vbCBvZiBjb21wdXRlciAtIDYwNSBzdGFmZiByb29tDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotDQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQ0KLWZlYXR1cmVOYW1lPVBUUCBTdXBwb3J0IEZvciBTTFVSTQ0KLQ0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlDQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUNCi0NCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQ0KLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgU2x1cm0NCi0NCi0jIGNvcHlyaWdodA0KLWNvcHlyaWdodD1cDQotICAgQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgU2Nob29sIG9mIENvbXB1dGVyLE5hdGlvbmFsIFVuaXZlcnNpdHkgXG5cDQotICBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksUC5SLkNoaW5hLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW1cblwNCi0gIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIFxuXA0KLSAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbixcblwNCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwNCi0gIENvbnRyaWJ1dG9yczpcblwNCi0gIFNjaG9vbCBvZiBDb21wdXRlciAtIDYwNSBzdGFmZiByb29tDQotDQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiDQotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi0NCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIg0KLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIg0KLWxpY2Vuc2U9XA0KLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXA0KLU1hcmNoIDE3LCAyMDA1XG5cDQotXG5cDQotVXNhZ2UgT2YgQ29udGVudFxuXA0KLVxuXA0KLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwNCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwNCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwNCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwNCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cDQotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXA0KLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cDQotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwNCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cDQotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwNCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cDQotXG5cDQotQXBwbGljYWJsZSBMaWNlbnNlc1xuXA0KLVxuXA0KLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cDQotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwNCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXA0KLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXA0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXA0KLVxuXA0KLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXA0KLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXA0KLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cDQotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cDQotXG5cDQotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXA0KLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXA0KLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwNCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwNCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwNCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXA0KLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwNCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXA0KLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXA0KLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cDQotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwNCi1cblwNCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwNCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXA0KLUluY2x1ZGVkIEZlYXR1cmVzLlxuXA0KLVxuXA0KLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwNCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwNCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXA0KLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwNCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cDQotXG5cDQotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwNCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cDQotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cDQotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cDQotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cDQotXG5cDQotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXA0KLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cDQotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cDQotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwNCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXA0KLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwNCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwNCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwNCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwNCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwNCi1cblwNCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwNCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwNCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cDQotXG5cDQotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cDQotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cDQotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXA0KLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwNCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwNCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXA0KLVxuXA0KLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwNCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXA0KLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cDQotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXA0KLVxuXA0KLUNyeXB0b2dyYXBoeVxuXA0KLVxuXA0KLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXA0KLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwNCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cDQotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cDQotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXA0KLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXA0KLVxuXA0KLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuDQotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5MjkxLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlbyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0uY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51dGlscy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4NCi08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4NCi08cD5NYXJjaCAxNywgMjAwNTwvcD4NCi0NCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+DQotDQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTDQotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFDQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1INCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+DQotICAgDQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIA0KLSAgIA0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjANCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMNCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+DQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4NCi0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zDQotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+DQotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPg0KLTwvdWw+ICAgDQotIA0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kDQotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUNCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+DQotDQotPHVsPg0KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4NCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4NCi0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPg0KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPg0KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+DQotPC91bD4NCi0JCQ0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlDQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yDQotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLg0KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbg0KLXRoYXQgZGlyZWN0b3J5LjwvcD4NCi0NCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQ0KLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPg0KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JDQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+DQotPC91bD4NCi0NCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQ0KLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPg0KLQ0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPg0KLQ0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8NCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwNCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4NCi0gICANCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICANCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhYmMyNy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NGFmODYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTIzMDdlLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFNlcnZpY2VzIEZyYW1ld29yawotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVBUUCBjb21wb25lbnRzIGZvciBtYW5hZ2luZyBzZXJ2aWNlcwotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTU5ZTUuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2Y2UwYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDFlMzU0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNNb24gT2N0IDA2IDE0OjM2OjQ0IEdNVC0wMzowMCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Q0OTY0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2Uuc2VhcmNoLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LmluaSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDE1ZTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QVFAgTVBJQ0gyIChuZXcpIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjFmODkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZGF0YS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZGF0YS9kZWZhdWx0cy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZGF0YS9kZWZhdWx0cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzhkYjllLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2RhdGEvZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTEFVTkNIX0NNRD1tcGlleGVjIC1sIC1hICR7TVBJQ0gyX2pvYmlkfSAke01QSUNIMl9hcmdzfSAke01QSUNIMl9lbnZ9ICR7ZXhlY1BhdGh9LyR7ZXhlY05hbWV9ICR7cHJvZ0FyZ3N9Ci1ERUJVR19DTUQ9bXBpZXhlYyAgLWwgLWEgJHtNUElDSDJfam9iaWR9ICR7TVBJQ0gyX2FyZ3N9ICR7TVBJQ0gyX2Vudn0gJHtkZWJ1Z0V4ZWNQYXRofS8ke2RlYnVnRXhlY05hbWV9ICR7ZGVidWdBcmdzfQotRElTQ09WRVJfQ01EPW1wZHRyYWNlIC1sCi1QRVJJT0RJQ19DTUQ9bXBkbGlzdGpvYnMKLVBFUklPRElDX1RJTUU9NTAwMAotUEFUSD0KLVVTRV9ERUZBVUxUUz10cnVlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9lY2xpcHNlMzIucG5nIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmYjViYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgTVBJQ0gyIChuZXcpIFN1cHBvcnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhMTQzYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUucHJvdmlkZXJzIj4KLSAgICAgIDxwcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uTVBJQ0gyU2VydmljZVByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLk1QSUNIMlNlcnZpY2VQcm92aWRlciIKLSAgICAgICAgICAgIG5hbWU9Ik1QSUNIMiIKLSAgICAgICAgICAgIHNlcnZpY2VJZD0ib3JnLmVjbGlwc2UucHRwLmNvcmUuTGF1bmNoU2VydmljZSI+Ci0gICAgICA8L3Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGE0ZTYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUZGRUNUSVZFX01QSUNIMl9FTlZfQVRUUl9JRCA9ICJNUElDSDJfZW52IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RJVkVfTVBJQ0gyX1BST0dfQVJHU19BVFRSX0lEID0gIk1QSUNIMl9wcm9nQXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUZGRUNUSVZFX01QSUNIMl9XT1JLSU5HX0RJUl9BVFRSX0lEID0gIk1QSUNIMl93b3JraW5nRGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZiA9Ci0JCW5ldyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPihFRkZFQ1RJVkVfTVBJQ0gyX0VOVl9BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbnVsbCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWYgPQotCQluZXcgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4oRUZGRUNUSVZFX01QSUNIMl9QUk9HX0FSR1NfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyUHJvZ0FyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCBudWxsKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJEZWYgPQotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihFRkZFQ1RJVkVfTVBJQ0gyX1dPUktJTkdfRElSX0FUVFJfSUQsIE1lc3NhZ2VzLk1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgTVBJQ0gyIGhhcyBwYXNzZWQgdG8gdGhlIHByb2Nlc3Nlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldEVmZmVjdGl2ZU1QSUNIMkVudkF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBlZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIFByb2dyYW0gYXJndW1lbnRzIHRoYXQgTVBJQ0gyIGhhcyBwYXNzZWQgdG8gdGhlIHByb2Nlc3Nlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldEVmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBXb3JraW5nIGRpcmVjdG9yeSB3aGVyZSBNUElDSDIgaGFzIHN0YXJ0ZWQgdGhlIHByb2Nlc3Nlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBlZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJEZWZhdWx0cy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiNGIyZC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJEZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJEZWZhdWx0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQVVOQ0hfQ01EID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUJVR19DTUQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU0NPVkVSX0NNRCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSSU9ESUNfQ01EID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGludCBQRVJJT0RJQ19USU1FID0gMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQVRIID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVVNFX0RFRkFVTFRTID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdHNSZXNvdXJjZVBhdGggPSAiL2RhdGEvZGVmYXVsdHMucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkRGVmYXVsdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBhdGggZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCA9IG5ldyBQYXRoKGRlZmF1bHRzUmVzb3VyY2VQYXRoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IE1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IHJlYWQoZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgYnVuZGxlKTsKLQotCQlMQVVOQ0hfQ01EID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIkxBVU5DSF9DTUQiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVR19DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiREVCVUdfQ01EIik7IC8vJE5PTi1OTFMtMSQKLQkJRElTQ09WRVJfQ01EID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIkRJU0NPVkVSX0NNRCIpOyAvLyROT04tTkxTLTEkCi0JCVBFUklPRElDX0NNRCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJQRVJJT0RJQ19DTUQiKTsgLy8kTk9OLU5MUy0xJAotCQlQRVJJT0RJQ19USU1FID0gZ2V0SW50ZWdlcihidW5kbGUsIHByb3BlcnRpZXMsICJQRVJJT0RJQ19USU1FIik7IC8vJE5PTi1OTFMtMSQKLQkJUEFUSCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJQQVRIIik7IC8vJE5PTi1OTFMtMSQKLQkJVVNFX0RFRkFVTFRTID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VfREVGQVVMVFMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydCBMQVVOQ0hfQ01EICE9IG51bGw7Ci0JCWFzc2VydCBERUJVR19DTUQgIT0gbnVsbDsKLQkJYXNzZXJ0IERJU0NPVkVSX0NNRCAhPSBudWxsOwotCQlhc3NlcnQgUEVSSU9ESUNfQ01EICE9IG51bGw7Ci0JCWFzc2VydCBQQVRIICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIHJlYWQoUGF0aCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBCdW5kbGUgYnVuZGxlKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW07Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlpblN0cmVhbSA9IEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oYnVuZGxlLCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBmYWxzZSk7Ci0JCQlwcm9wZXJ0aWVzLmxvYWQoaW5TdHJlYW0pOwotCi0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgTVBJQ0gyUGx1Z2luLmNvcmVFcnJvckV4Y2VwdGlvbihNZXNzYWdlcy5NUElDSDJEZWZhdWx0c19FeGNlcHRpb25fRmFpbGVkUmVhZEZpbGUsIGUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkRlZmF1bHRzX01pc3NpbmdWYWx1ZSwga2V5KSkpOwotCQl9Ci0JCQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50ZWdlcihCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywga2V5KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5NUElDSDJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXIsIGtleSkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCBrZXkpOwotCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkpvYkF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkpvYkF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2NTFiYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJKb2JBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotCi0vKioKLSAqIE1QSUNIMiBqb2IgYXR0cmlidXRlcy4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gySm9iQXR0cmlidXRlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX0lEX0FUVFJfSUQgPSAiTVBJQ0gyX2pvYmlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUTkFNRV9BVFRSX0lEID0gIk1QSUNIMl9ob3N0bmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gam9iSWRBdHRyRGVmID0KLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oSk9CX0lEX0FUVFJfSUQsIE1lc3NhZ2VzLk1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gaG9zdG5hbWVBdHRyRGVmID0KLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oSE9TVE5BTUVfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gySm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfdGl0bGUsIAotCQkJCU1lc3NhZ2VzLk1QSUNIMkpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRKb2JJZEF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBqb2JJZEF0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldEhvc3RuYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGhvc3RuYW1lQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltde2pvYklkQXR0ckRlZiwgaG9zdG5hbWVBdHRyRGVmfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMwZGEyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkxhdW5jaEF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BcnJheUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotCi0vKioKLSAqIE9NUEktc3BlY2lmaWMgYXR0cmlidXRlcwotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hfQVJHU19BVFRSX0lEID0gIk1QSUNIMl9hcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfS0VZU19BVFRSX0lEID0gIk1QSUNIMl9lbnZLZXlzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfQVJHU19BVFRSX0lEID0gIk1QSUNIMl9lbnYiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGxhdW5jaEFyZ3NBdHRyRGVmID0KLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oTEFVTkNIX0FSR1NfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2xhdW5jaEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uLCBmYWxzZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlbnZpcm9ubWVudEtleUF0dHJEZWYgPSBuZXcgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4oCi0JCQlFTlZfS0VZU19BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50S2V5QXR0ckRlZl90aXRsZSwKLQkJCU1lc3NhZ2VzLk1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX2Rlc2NyaXB0aW9uLCBmYWxzZSwKLQkJCW5ldyBTdHJpbmdbMF0pOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBlbnZpcm9ubWVudEFyZ3NBdHRyRGVmID0gbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oCi0JCQlFTlZfQVJHU19BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfdGl0bGUsIE1lc3NhZ2VzLk1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbiwgZmFsc2UsCi0JIiR7TVBJQ0gyX2VudktleXM6OiAteCA6Oi14IDp9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExpc3Qgb2YgbmFtZXMgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgYXBwbGljYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBnZXRFbnZpcm9ubWVudEtleXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZW52aXJvbm1lbnRLZXlBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCBhcyBleHBlY3RlZCBieSBvcGVubXBpIGNvbW1hbmQgbGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RW52aXJvbm1lbnRBcmdzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVudmlyb25tZW50QXJnc0F0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogQXJndW1lbnRzIGZvciB0aGUgYXBwbGljYXRpb24sIGFzIGV4cGVjdGVkIGJ5IG9wZW5tcGkgY29tbWFuZCBsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRMYXVuY2hBcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gbGF1bmNoQXJnc0F0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXsKLQkJCQlsYXVuY2hBcmdzQXR0ckRlZixlbnZpcm9ubWVudEFyZ3NBdHRyRGVmLGVudmlyb25tZW50S2V5QXR0ckRlZgotCQl9OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJNYWNoaW5lQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4YjUxYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJNYWNoaW5lQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBOb2RlIGF0dHJpYnV0ZXMKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19NRVNTQUdFID0gIk1QSUNIMl9zdGF0dXNNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBzdGF0dXNNZXNzYWdlQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFNUQVRVU19NRVNTQUdFLCBNZXNzYWdlcy5NUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdGF0dXMgbWVzc2FnZSBpZiBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2NvdmVyIHRoZSBtYWNoaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXR1c01lc3NhZ2VBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117c3RhdHVzTWVzc2FnZUF0dHJEZWZ9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTm9kZUF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMk5vZGVBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjFiOTYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTm9kZUF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotCi0vKioKLSAqIE5vZGUgYXR0cmlidXRlcwotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJOb2RlQXR0cmlidXRlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNX05PREVTX0lEID0gIk1QSUNIMl9udW1Ob2RlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX05VTV9OT0RFU19JRCA9ICJNUElDSDJfbWF4TnVtTm9kZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19NRVNTQUdFID0gIk1QSUNIMl9zdGF0dXNNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSU1VCU0NSSUJFRCA9ICJNUElDSDJfb3ZlcnN1YnNjcmliZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBudW1Ob2Rlc0F0dHJEZWYgPQotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oTlVNX05PREVTX0lELCBNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbnVtTm9kZXNBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCBuZXcgSW50ZWdlcigwKSk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBtYXhOdW1Ob2Rlc0F0dHJEZWYgPQotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oTUFYX05VTV9OT0RFU19JRCwgTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbWF4TnVtTm9kZXNBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbmV3IEludGVnZXIoMCkpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBzdGF0dXNNZXNzYWdlQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFNUQVRVU19NRVNTQUdFLCBNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBvdmVyc3Vic2NyaWJlZEF0dHJEZWYgPQotCQluZXcgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24oT1ZFUlNVQlNDUklCRUQsIE1lc3NhZ2VzLk1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19vdmVyc3Vic2NyaWJlZEF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0KLQkvKioKLQkgKiBOdW1iZXIgb2Ygc2xvdHMgc3VnZ2VzdGVkIG9uIHRoZSBub2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0TnVtYmVyT2ZOb2Rlc0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBudW1Ob2Rlc0F0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogTWF4aW1hbCBudW1iZXIgb2Ygc2xvdHMgb24gdGhlIG5vZGUuIFplcm8gaWYgbm90IHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE1heGltYWxOdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG1heE51bU5vZGVzQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBTdGF0dXMgbWVzc2FnZSBpZiBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2NvdmVyIHRoZSBub2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXR1c01lc3NhZ2VBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIElmIG5vZGUgaXMgb3ZlcnN1YnNjcmliZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRPdmVyc3Vic2NyaWJlZEF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBvdmVyc3Vic2NyaWJlZEF0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXtudW1Ob2Rlc0F0dHJEZWYsbWF4TnVtTm9kZXNBdHRyRGVmLHN0YXR1c01lc3NhZ2VBdHRyRGVmfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQbHVnaW4uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGY3ZDQ2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMlBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlJNQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBNUElDSDJQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE1QSUNIMlBsdWdpbigpIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCU1QSUNIMkRlZmF1bHRzLmxvYWREZWZhdWx0cygpOwotCQlNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5pbml0aWFsaXplUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1QSUNIMlBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUk1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGNvcmVFcnJvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUk1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgbWVzc2FnZSwgdCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhbiBJU3RhdHVzCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBUaHJvd2FibGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5NUElDSDJQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3IsIGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyCi0JICogCi0JICogQHJldHVybiB1bmlxdWUgaWRlbnRpZmllciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpCi0JCQkvLyBJZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLAotCQkJLy8gcmV0dXJuIGEgc3RhdGljIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBtdXN0Ci0JCQkvLyBtYXRjaCB0aGUgcGx1Z2luIGlkIGRlZmluZWQgaW4gcGx1Z2luLnhtbAotCQkJcmV0dXJuIFBMVUdJTl9JRDsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQcmVmZXJlbmNlTWFuYWdlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4ZGRiMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQcmVmZXJlbmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyOwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm1waWNoMi0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gTVBJQ0gyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCU1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBNUElDSDJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfTEFVTkNIX0NNRCwgTVBJQ0gyRGVmYXVsdHMuTEFVTkNIX0NNRCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfREVCVUdfQ01ELCBNUElDSDJEZWZhdWx0cy5ERUJVR19DTUQpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX0RJU0NPVkVSX0NNRCwgTVBJQ0gyRGVmYXVsdHMuRElTQ09WRVJfQ01EKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19QRVJJT0RJQ19NT05JVE9SX0NNRCwgTVBJQ0gyRGVmYXVsdHMuUEVSSU9ESUNfQ01EKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19QRVJJT0RJQ19NT05JVE9SX1RJTUUsIE1QSUNIMkRlZmF1bHRzLlBFUklPRElDX1RJTUUpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgsIE1QSUNIMkRlZmF1bHRzLlBBVEgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjYzYjdhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGVmYXVsdHNfTWlzc2luZ1ZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFJhbmdlQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRSYW5nZUF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gySm9iQXR0cmlidXRlc192cGlkU3RhcnRBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFN0YXJ0QXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbWF4TnVtTm9kZXNBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk5vZGVBdHRyaWJ1dGVzX251bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfb3ZlcnN1YnNjcmliZWRBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHROYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfZGVmYXVsdFF1ZXVlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRQYXJzZUhvc3RGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRSZWFkSG9zdEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlRW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlUGF0aE5vdEFic29sdXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRJbnRlcm5hbEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRNaXNzaW5nSG9zdEZpbGVQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0RmlsZUVycm9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVQYXJzZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFBhcnNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZU91dHB1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkV2l0aENvZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0lnbm9yZWRJbnZhbGlkUGFyYW1ldGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9JbnZhbGlkTWF4U2xvdHNQYXJhbWV0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0ludmFsaWRTbG90c1BhcmFtZXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfcHJvY2Vzc0Vycm9yTWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNb25pdG9ySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk1vbml0b3JKb2JfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNb25pdG9ySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTW9uaXRvckpvYl9wcm9jZXNzRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk1vbml0b3JKb2JfRXhjZXB0aW9uX0NvbW1hbmRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTW9uaXRvckpvYl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9NaXNzaW5nRGlzcGxheU1hcEluZm9ybWF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0Jyb2tlbkRpc3BsYXlNYXBJbmZvcm1hdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX0F0dHJpYnV0ZU5vdEludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9NaXNzaW5nQXR0cmlidXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkF0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX1Vua25vd25FbGVtZW50OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJ1bnRpbWVTeXN0ZW1fSm9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9GYWlsZWRQYXJzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZXNEb05vdE1hdGNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfUHJvY2Vzc05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmFpbGVkV2l0aEV4aXRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25GYWlsZWRXaXRoU2lnbmFsOwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBQcmV2ZW50IGluc3RhbmNlcy4KLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzZDk0Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotTVBJQ0gyRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlPUZhaWxlZCB0byByZWFkIHByb3BlcnRpZXMgZmlsZSB3aXRoIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi1NUElDSDJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI9RmFpbGVkIHRvIHBhcnNlIGludGVnZXIgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1NUElDSDJEZWZhdWx0c19NaXNzaW5nVmFsdWU9TWlzc2luZyBkZWZhdWx0IHZhbHVlIGZvciB7MH0KLU1QSUNIMjEzRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlPUZhaWxlZCB0byByZWFkIHByb3BlcnRpZXMgZmlsZSB3aXRoIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi1NUElDSDIxM0RlZmF1bHRzX0ZhaWxlZFBhcnNlSW50ZWdlcj1GYWlsZWQgdG8gcGFyc2UgaW50ZWdlciBkZWZhdWx0IHZhbHVlIGZvciB7MH0KLU1QSUNIMjEzRGVmYXVsdHNfTWlzc2luZ1ZhbHVlPU1pc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl9kZXNjcmlwdGlvbj1FZmZlY3RpdmUgZW52aXJvbm1lbnQgc3VwcGxpZWQgYnkgTVBJQ0gyIHRvIGV4ZWN1dGFibGUgb24gbGF1bmNoCi1NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl90aXRsZT1FbnZpcm9ubWVudCBmb3IgTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbj1FZmZlY3RpdmUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBieSBNUElDSDIgc3VwcGxpZWQgdG8gZXhlY3V0YWJsZQotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl90aXRsZT1Qcm9ncmFtIEFyZ3VtZW50cyBmb3IgTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX2Rlc2NyaXB0aW9uPUVmZmVjdGl2ZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSBNUElDSDIgbGF1bmNoZWQgdGhlIHByb2Nlc3NlcwotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX3RpdGxlPVdvcmtpbmcgRGlyZWN0b3J5IGZvciBNUElDSDIgcHJvY2Vzc2VzCi1NUElDSDJKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgam9iIGhvc3RuYW1lCi1NUElDSDJKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl90aXRsZT1NUElDSDIgaG9zdG5hbWUKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBtYXBwaW5nIG1vZGUKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX3RpdGxlPU1QSUNIMiBtYXBwaW5nIG1vZGUKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBqb2IgaWQKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX3RpdGxlPU1QSUNIMiBqb2IgaWQKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFJhbmdlQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgdnBpZCByYW5nZQotTVBJQ0gySm9iQXR0cmlidXRlc192cGlkUmFuZ2VBdHRyRGVmX3RpdGxlPU1QSUNIMiB2cGlkIHJhbmdlCi1NUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRTdGFydEF0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIHZwaWQgc3RhcnQKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFN0YXJ0QXR0ckRlZl90aXRsZT1NUElDSDIgdnBpZCBzdGFydAotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uPUNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgZWFjaCBNUElDSDIgcHJvY2Vzc2VzCi1NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfdGl0bGU9TVBJQ0gyIEVudmlyb25tZW50IGFyZ3VtZW50cwotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfZGVzY3JpcHRpb249TmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3VwcGxpZWQgdG8gdGhlIGVhY2ggTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfdGl0bGU9TVBJQ0gyIGVudmlyb25tZW50IHZhcmlhYmxlcwotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbj1Db21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBNUElDSDIKLU1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfdGl0bGU9TVBJQ0gyIGFyZ3VtZW50cwotTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIHN0YXR1cyBtZXNzYWdlCi1NUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZT1NUElDSDIgc3RhdHVzIG1lc3NhZ2UKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgbWF4aW1hbCBudW1iZXIgb2Ygbm9kZXMgb24gdGhlIGhvc3QKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl90aXRsZT1NUElDSDIgbWF4aW1hbCBudW1iZXIgb2Ygbm9kZXMKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX251bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgbnVtYmVyIG9mIG5vZGVzIG9uIHRoZSBob3N0Ci1NUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfdGl0bGU9TVBJQ0gyIG51bWJlciBvZiBub2RlcwotTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfb3ZlcnN1YnNjcmliZWRBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBvdmVyc3Vic2NyaWJlZCBub2RlIChtb3JlIHByb2Nlc3NlcyB0aGFuIGF2YWlsYWJsZSkKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZT1NUElDSDIgb3ZlcnN1YnNjcmliZWQKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBzdGF0dXMgbWVzc2FnZQotTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGU9TVBJQ0gyIHN0YXR1cyBtZXNzYWdlCi1NUElDSDJQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I9SW50ZXJuYWwgZXJyb3IKLQotTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0RGVzY3JpcHRpb249TVBJQ0gyIFJlc291cmNlIE1hbmFnZXIKLU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdE5hbWU9TVBJQ0gyCi0KLU1QSUNIMkRpc2NvdmVySm9iX2RlZmF1bHRRdWV1ZU5hbWU9ZGVmYXVsdAotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEZhaWxlZD1FcnJvciB3aGlsZSBydW5uaW5nIGRpc2NvdmVyIGNvbW1hbmQ6IHswfS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRQYXJzZUhvc3RGaWxlPUZhaWxlZCB0byBwYXJzZSBob3N0ZmlsZSAoezB9KS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRSZWFkSG9zdEZpbGU9RmFpbGVkIHJlYWQgaG9zdGZpbGUgKHswfSkuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVFbXB0eT1FbXB0eSBob3N0ZmlsZSBpcyBub3QgYWxsb3dlZCAoezB9KS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZU5vdEZvdW5kPUZhaWxlZCBmaW5kIGhvc3RmaWxlICh7MH0pLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlUGF0aE5vdEFic29sdXRlPURpc2NvdmVyIGNvbW1hbmQgaW5mb3JtZWQgYSBwYXRoIHRvIGhvc3RmaWxlIHRoYXQgaXMgbm90IGFuIGFic29sdXRlIHBhdGggKHswfSkuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSW50ZXJuYWxFcnJvcj1JbnRlcm5hbCBlcnJvciB3aGlsZSBydW5uaW5nIGRpc2NvdmVyIGNvbW1hbmQ6IHswfQotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZE1pc3NpbmdIb3N0RmlsZVBhdGg9RGlzY292ZXIgY29tbWFuZCBkaWQgbm90IGluZm9ybSBwYXRoIHRvIGRlZmF1bHQgaG9zdGZpbGUuIElmIG5lY2Vzc2FyeSwgc2V0IE1DQSBwYXJhbWV0ZXJzIHRvIGRlZmluZSBkZWZhdWx0IGhvc3RmaWxlIHBhdGguCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVFcnJvcnM9VGhlcmUgYXJlIGVycm9ycyBpbiB0aGUgaG9zdGZpbGUuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVQYXJzZUVycm9yPVBhcnNlIGVycm9yKHMpIGluIGhvc3RmaWxlLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZD1GYWlsZWQgdG8gcnVuIGNvbW1hbmQgdG8gZ2V0IGhvc3RuYW1lLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFBhcnNlPUZhaWxlZCB0byBwYXJzZSBjb21tYW5kIGZvciBob3N0bmFtZS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZU91dHB1dD1GYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IG9mIGRpc2NvdmVyIGNvbW1hbmQuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkV2l0aENvZGU9Q29tbWFuZCB0byBnZXQgaG9zdG5hbWUgZmFpbGVkIHdpdGggZXhpdCBjb2RlIHswfQotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0lnbm9yZWRJbnZhbGlkUGFyYW1ldGVyPUludmFsaWQgcGFyYW1ldGVyIHdhcyBpZ25vcmVkIGZvciB0aGlzIGhvc3QuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSW52YWxpZE1heFNsb3RzUGFyYW1ldGVyPUludmFsaWQgJ21heC1zbG90cycgcGFyYW1ldGVyIHdhcyBpZ25vcmVkIGZvciB0aGlzIGhvc3QuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSW52YWxpZFNsb3RzUGFyYW1ldGVyPUludmFsaWQgJ3Nsb3RzL2NwdXMvY291bnQnIHBhcmFtZXRlciB3YXMgaWdub3JlZCBmb3IgdGhpcyBob3N0LgotTVBJQ0gyRGlzY292ZXJKb2JfaW50ZXJydXB0ZWRFcnJvck1lc3NhZ2U9SW50ZXJydXB0ZWQgd2hpbGUgcnVubmluZyBNUElDSDIgZGlzY292ZXIgY29tbWFuZC4KLU1QSUNIMkRpc2NvdmVySm9iX25hbWU9RGlzY292ZXIgTVBJQ0gyIG9uIHswfQotTVBJQ0gyRGlzY292ZXJKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZT1GYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IG9mIE1QSUNIMiBkaXNjb3ZlciBjb21tYW5kLgotTVBJQ0gyRGlzY292ZXJKb2JfcHJvY2Vzc0Vycm9yTWVzc2FnZT1GYWlsZWQgdG8gY3JlYXRlIHJlbW90ZSBwcm9jZXNzIGZvciBNUElDSDIgZGlzY292ZXIgY29tbWFuZC4KLQotTVBJQ0gyUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fSW52YWxpZExpbmU9SW52YWxpZCBvdXRwdXQgZnJvbSBNUElDSDI6IHswfQotTVBJQ0gyUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fTWlzc2luZ0Rpc3BsYXlNYXBJbmZvcm1hdGlvbj1PdXRwdXQgZnJvbSBNUElDSDIgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHByb2Nlc3NlcyBhbmQgbm9kZXMuCi1NUElDSDJQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9Ccm9rZW5EaXNwbGF5TWFwSW5mb3JtYXRpb249SW5jb21wbGV0ZSBvdXRwdXQgZnJvbSBNUElDSDIuCi0KLU1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fQXR0cmlidXRlTm90SW50ZWdlcj1BdHRyaWJ1dGUgezB9IGlzIG5vdCBhbiB2YWxpZCBpbnRlZ2VyICh7MX0pCi1NUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX01pc3NpbmdBdHRyaWJ1dGU9TWlzc2luZyBYTUwgYXR0cmlidXRlOiB7MH0KLU1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkF0dHJpYnV0ZT1Vbmtub3duIFhNTCBhdHRyaWJ1dGU6IHswfQotTVBJQ0gyUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9Vbmtub3duRWxlbWVudD1Vbmtub3duIFhNTCBlbGVtZW50OiB7MH0KLQotTVBJQ0gyUnVudGltZVN5c3RlbV9Kb2JOYW1lPU1QSUNIMiBKb2IKLU1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0ZhaWxlZFBhcnNlPUZhaWxlZCB0byBwYXJzZSBNUElDSDIgcnVuIGNvbW1hbmQgb3V0cHV0LgotTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fSG9zdG5hbWVzRG9Ob3RNYXRjaD1Ib3N0bmFtZXMgZnJvbSBNUElDSDIgb3V0cHV0IGRvIG5vdCBtYXRjaCBleHBlY3RlZCBob3N0bmFtZS4KLU1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfUHJvY2Vzc05hbWU9TVBJQ0gyIHJ1bgotCi1NUElDSDJNb25pdG9ySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlPUludGVycnVwdGVkIHdoaWxlIHJ1bm5pbmcgTVBJQ0gyIG1vbml0b3IgY29tbWFuZC4KLU1QSUNIMk1vbml0b3JKb2JfbmFtZT1Nb25pdG9yIE1QSUNIMiBvbiB7MH0KLU1QSUNIMk1vbml0b3JKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZT1GYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IG9mIE1QSUNIMiBtb25pdG9yIGNvbW1hbmQuCi1NUElDSDJNb25pdG9ySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2U9RmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgcHJvY2VzcyBmb3IgTVBJQ0gyIG1vbml0b3IgY29tbWFuZC4KLU1QSUNIMk1vbml0b3JKb2JfRXhjZXB0aW9uX0NvbW1hbmRGYWlsZWQ9RXJyb3Igd2hpbGUgcnVubmluZyBjb21tYW5kOiB7MH0uCi1NUElDSDJNb25pdG9ySm9iX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yIHdoaWxlIHJ1bm5pbmcgY29tbWFuZDogezB9Ci1NUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25GYWlsZWRXaXRoRXhpdFZhbHVlPUpvYiB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgd2l0aCBleGl0IHZhbHVlIHswfS4gVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IG9uZSBvciBtb3JlIHByb2Nlc3NlcyBleGl0aW5nIHdpdGggYSBub24temVybyBleGl0IGNvZGUsIG9yIGV4aXRpbmcgYmVmb3JlIGNhbGxpbmcgTVBJX0ZpbmFsaXplLgotTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmFpbGVkV2l0aFNpZ25hbD1Kb2IgdGVybWluYXRlZCBhYm5vcm1hbGx5IGR1ZSB0byBzaWduYWwgezB9LiBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgb25lIG9yZSBtb3JlIHByb2Nlc3NlcyBleGl0aW5nIGR1ZSB0byB0aGlzIHNpZ25hbC4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL0VmZmVjdGl2ZU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL0VmZmVjdGl2ZU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4ZWI2Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9FZmZlY3RpdmVNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLklUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFZmZlY3RpdmVNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGV4dGVuZHMKLUFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbiB7Ci0KLQlwdWJsaWMgRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbigKLQkJCUlUb29sUk1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbik7Ci0JCUlNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIE1QSUNIMmNvbmZpZ3VyYXRpb24gPSAoSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pY29uZmlndXJhdGlvbjsKLQkJU3RyaW5nIGxhdW5jaENtZCA9IG51bGw7Ci0JCVN0cmluZyBkZWJ1Z0NtZCA9IG51bGw7Ci0JCVN0cmluZyBkaXNjb3ZlckNtZCA9IG51bGw7Ci0JCVN0cmluZyBwZXJpb2RpY0NtZCA9IG51bGw7Ci0JCWludCBwZXJpb2RpY1RpbWUgPSAwOwotCQlTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGggPSBudWxsOwotCQlpZiAoTVBJQ0gyY29uZmlndXJhdGlvbi5nZXRVc2VUb29sRGVmYXVsdHMoKSkgewotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCQkJbGF1bmNoQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0xBVU5DSF9DTUQpOwotCQkJZGVidWdDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfREVCVUdfQ01EKTsKLQkJCWRpc2NvdmVyQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RJU0NPVkVSX0NNRCk7Ci0JCQlwZXJpb2RpY0NtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX0NNRCk7Ci0JCQlwZXJpb2RpY1RpbWUgPSBwcmVmZXJlbmNlcy5nZXRJbnQoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUEVSSU9ESUNfTU9OSVRPUl9USU1FKTsKLQkJfSBlbHNlIHsKLQkJCWxhdW5jaENtZCA9IE1QSUNIMmNvbmZpZ3VyYXRpb24uZ2V0TGF1bmNoQ21kKCk7Ci0JCQlkZWJ1Z0NtZCA9IE1QSUNIMmNvbmZpZ3VyYXRpb24uZ2V0RGVidWdDbWQoKTsKLQkJCWRpc2NvdmVyQ21kID0gTVBJQ0gyY29uZmlndXJhdGlvbi5nZXREaXNjb3ZlckNtZCgpOwotCQkJcGVyaW9kaWNDbWQgPSBNUElDSDJjb25maWd1cmF0aW9uLmdldFBlcmlvZGljTW9uaXRvckNtZCgpOwotCQkJcGVyaW9kaWNUaW1lID0gTVBJQ0gyY29uZmlndXJhdGlvbi5nZXRQZXJpb2RpY01vbml0b3JUaW1lKCk7Ci0JCX0KLQkJcmVtb3RlSW5zdGFsbFBhdGggPSBNUElDSDJjb25maWd1cmF0aW9uLmdldFJlbW90ZUluc3RhbGxQYXRoKCk7Ci0JCWFwcGx5VmFsdWVzKGxhdW5jaENtZCwgZGVidWdDbWQsIGRpc2NvdmVyQ21kLCBwZXJpb2RpY0NtZCwgcGVyaW9kaWNUaW1lLCBudWxsLCByZW1vdGVJbnN0YWxsUGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhNDhlNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uSVRvb2xSTUNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJVG9vbFJNQ29uZmlndXJhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBpbnQgTVBJQ0gyX0NBUEFCSUxJVElFUyA9IENBUF9MQVVOQ0ggfCBDQVBfRElTQ09WRVIgfCBDQVBfUEVSSU9ESUNfTU9OSVRPUiB8IENBUF9SRU1PVEVfSU5TVEFMTF9QQVRIOwotCi0JLyoqCi0JICogR2V0IHRoZSB2ZXJzaW9uIHNlbGVjdGVkIHdoZW4gY29uZmlndXJpbmcgdGhlIFJNCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBNUElDSDIgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZlcnNpb24gdGhhdCBpcyBzZWxlY3RlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBSTQotCSAqIAotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgTVBJQ0gyIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSWQoU3RyaW5nIHZlcnNpb25JZCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9NUElDSDJSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZWNhZWNiLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5BYnN0cmFjdFRvb2xzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdFRvb2xSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbS5NUElDSDJSdW50aW1lU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVTeXN0ZW07Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSZXNvdXJjZU1hbmFnZXIgewotCi0JcHJpdmF0ZSBJbnRlZ2VyIE1QSUNIMl9STUlEOwotCXByaXZhdGUgTVBJQ0gyUnVudGltZVN5c3RlbSBydHMgPSBudWxsOwotCi0JcHVibGljIE1QSUNIMlJlc291cmNlTWFuYWdlcihJbnRlZ2VyIGlkLCBJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSwgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGlkLnRvU3RyaW5nKCksIHVuaXZlcnNlLCBjb25maWcpOwotCQlNUElDSDJfUk1JRCA9IGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUnVudGltZVN5c3RlbSBkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKSB7Ci0JCUlNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IChJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOwotCQlBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBhdHRyRGVmTWdyID0gZ2V0QXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIoKTsKLQkJYXR0ckRlZk1nci5zZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhBYnN0cmFjdFRvb2xzQXR0cmlidXRlcy5nZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSk7Ci0JCXJ0cyA9IG5ldyBNUElDSDJSdW50aW1lU3lzdGVtKE1QSUNIMl9STUlELCBjb25maWcsIGF0dHJEZWZNZ3IpOwotCQlyZXR1cm4gcnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlNlcnZpY2VQcm92aWRlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyU2VydmljZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMThkMGMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyU2VydmljZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLkFic3RyYWN0VG9vbFJNU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE1QSUNIMlNlcnZpY2VQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VG9vbFJNU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMgSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkVSU0lPTl9JRCA9ICJ2ZXJzaW9uSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIEFjdHVhbCB2ZXJzaW9uIHRoYXQgaXMgdXNlZCB0byBzZWxlY3QgY29ycmVjdCBjb21tYW5kcy4gVGhpcyB2ZXJzaW9uCi0JICogb25seSBwZXJzaXN0cyB3aGlsZSB0aGUgUk0gaXMgcnVubmluZy4KLQkgKi8KLQlwcml2YXRlIGludCBtYWpvclZlcnNpb24gPSAwOwotCXByaXZhdGUgaW50IG1pbm9yVmVyc2lvbiA9IDA7Ci0JcHJpdmF0ZSBpbnQgc2VydmljZVZlcnNpb24gPSAwOwotCQotCXB1YmxpYyBNUElDSDJTZXJ2aWNlUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKE1QSUNIMl9DQVBBQklMSVRJRVMpOwotCi0JCVByZWZlcmVuY2VzIHByZWZzID0gTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJc2V0TGF1bmNoQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19MQVVOQ0hfQ01EKSk7Ci0JCXNldERlYnVnQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQpKTsKLQkJc2V0RGlzY292ZXJDbWQocHJlZnMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RJU0NPVkVSX0NNRCkpOwotCQlzZXRQZXJpb2RpY01vbml0b3JDbWQocHJlZnMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1BFUklPRElDX01PTklUT1JfQ01EKSk7Ci0JCXNldFBlcmlvZGljTW9uaXRvclRpbWUocHJlZnMuZ2V0SW50KE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1BFUklPRElDX01PTklUT1JfVElNRSkpOwotCQlzZXRSZW1vdGVJbnN0YWxsUGF0aChwcmVmcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCkpOwotCX0KLQkKLQlwdWJsaWMgTVBJQ0gyU2VydmljZVByb3ZpZGVyKE1QSUNIMlNlcnZpY2VQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwcm92aWRlcik7Ci0JCXByb3ZpZGVyLnNldExhdW5jaENtZChnZXRMYXVuY2hDbWQoKSk7Ci0JCXByb3ZpZGVyLnNldERlYnVnQ21kKGdldERlYnVnQ21kKCkpOwotCQlwcm92aWRlci5zZXREaXNjb3ZlckNtZChnZXREaXNjb3ZlckNtZCgpKTsKLQkJcHJvdmlkZXIuc2V0UGVyaW9kaWNNb25pdG9yQ21kKGdldFBlcmlvZGljTW9uaXRvckNtZCgpKTsKLQkJcHJvdmlkZXIuc2V0UGVyaW9kaWNNb25pdG9yVGltZShnZXRQZXJpb2RpY01vbml0b3JUaW1lKCkpOwotCQlwcm92aWRlci5zZXRSZW1vdGVJbnN0YWxsUGF0aChnZXRSZW1vdGVJbnN0YWxsUGF0aCgpKTsKLQkJcHJvdmlkZXIuc2V0VmVyc2lvbklkKGdldFZlcnNpb25JZCgpKTsKLQkJcHJvdmlkZXIuc2V0RGVzY3JpcHRpb24oZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJcmV0dXJuIG5ldyBNUElDSDJTZXJ2aWNlUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3ZpZGVyI2NyZWF0ZVJlc291cmNlTWFuYWdlcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIGNyZWF0ZVJlc291cmNlTWFuYWdlcigpIHsKLQkJSVBVbml2ZXJzZUNvbnRyb2wgdW5pdmVyc2UgPSAoSVBVbml2ZXJzZUNvbnRyb2wpIFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCk7Ci0JCXJldHVybiBuZXcgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyKEludGVnZXIudmFsdWVPZih1bml2ZXJzZS5nZXROZXh0UmVzb3VyY2VNYW5hZ2VySWQoKSksIHVuaXZlcnNlLCB0aGlzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIjZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKSB7Ci0JCXJldHVybiBnZXRJZCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jZ2V0VmVyc2lvbklkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25JZCgpIHsKLQkJcmV0dXJuIGdldFN0cmluZyhUQUdfVkVSU0lPTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm92aWRlciNzZXREZWZhdWx0TmFtZUFuZERlc2MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lQW5kRGVzYygpIHsKLQkJU3RyaW5nIG5hbWUgPSBNZXNzYWdlcy5NUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHROYW1lOwotCQlTdHJpbmcgY29ubiA9IGdldENvbm5lY3Rpb25OYW1lKCk7Ci0JCWlmIChjb25uICE9IG51bGwgJiYgIWNvbm4uZXF1YWxzKEVNUFRZX1NUUklORykpIHsKLQkJCW5hbWUgKz0gIkAiICsgY29ubjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldE5hbWUobmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLk1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXRWZXJzaW9uSWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSWQoU3RyaW5nIHZlcnNpb25JZCkgewotCQlwdXRTdHJpbmcoVEFHX1ZFUlNJT05fSUQsIHZlcnNpb25JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyRGlzY292ZXJKb2IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkRpc2NvdmVySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlN2M0MDkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyRGlzY292ZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5NYWNoaW5lQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJNYWNoaW5lQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMk5vZGVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEdyZWcgV2F0c29uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyRGlzY292ZXJKb2IgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2IgewotCU1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRzOwotCi0JcHVibGljIE1QSUNIMkRpc2NvdmVySm9iKE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRzKSB7Ci0JCXN1cGVyKHJ0cywKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9uYW1lLCBydHMuZ2V0Um1Db25maWd1cmF0aW9uKCkuZ2V0TmFtZSgpKSwKLQkJCQlydHMucmV0cmlldmVFZmZlY3RpdmVUb29sUm1Db25maWd1cmF0aW9uKCkuZ2V0RGlzY292ZXJDbWQoKSwKLQkJCQlNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9wcm9jZXNzRXJyb3JNZXNzYWdlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2UpOwotCQl0aGlzLnJ0cyA9IHJ0czsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShCdWZmZXJlZFJlYWRlciBvdXRwdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogTVBJIHJlc291cmNlIG1hbmFnZXIgaGF2ZSBvbmx5IG9uZSBtYWNoaW5lIGFuZCBvbmUgcXVldWUuCi0JCSAqIFRoZXJlIHRoZXkgYXJlIGltcGxpY2l0bHkgImRpc2NvdmVyZWQiLgotCQkgKi8KLQkJSVJlc291cmNlTWFuYWdlciBybSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJ0cy5nZXRSbUlEKCkpOwotCQlTdHJpbmcgbWFjaGluZUlEID0gcnRzLmNyZWF0ZU1hY2hpbmUocm0uZ2V0TmFtZSgpKTsKLQkJcnRzLnNldE1hY2hpbmVJRChtYWNoaW5lSUQpOwotCQlTdHJpbmcgcXVldWVJRCA9IHJ0cy5jcmVhdGVRdWV1ZShNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9kZWZhdWx0UXVldWVOYW1lKTsKLQkJcnRzLnNldFF1ZXVlSUQocXVldWVJRCk7Ci0KLQkJSVBNYWNoaW5lIG1hY2hpbmUgPSBybS5nZXRNYWNoaW5lQnlJZChtYWNoaW5lSUQpOwotCQlhc3NlcnQgbWFjaGluZSAhPSBudWxsOwotCi0JCS8qCi0JCSAqIEFueSBleGNlcHRpb24gZnJvbSBub3cgb24gaXMgY2F1Z2h0IGluIG9yZGVyIHRvIGFkZCB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhbiBhdHRyaWJ1dGUgdG8gdGhlIG1hY2hpbmUuCi0JCSAqIFRoZW4sIHRoZSBleGNlcHRpb24gaXMgcmUtdGhyb3duLgotCQkgKi8KLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBQYXJzZSBvdXRwdXQgb2YgdHJhY2UgY29tbWFuZCB0aGF0IGRlc2NyaWJlcyB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uCi0JCQkgKi8KLQkJCU1QSUNIMlRyYWNlUGFyc2VyIHBhcnNlciA9IG5ldyBNUElDSDJUcmFjZVBhcnNlcigpOwotCQkJTVBJQ0gySG9zdE1hcCBob3N0TWFwID0gcGFyc2VyLnBhcnNlKG91dHB1dCk7Ci0JCQlpZiAoaG9zdE1hcCA9PSBudWxsKSB7Ci0JCQkJbWFjaGluZS5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQkJbWFjaGluZS5hZGRBdHRyaWJ1dGUoTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RGaWxlUGFyc2VFcnJvcikpOwotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTVBJQ0gyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgcGFyc2VyLmdldEVycm9yTWVzc2FnZSgpKSk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBDcmVhdGUgbW9kZWwgYWNjb3JkaW5nIHRvIGRhdGEgZnJvbSBkaXNjb3Zlci4KLQkJCSAqLwotCQkJaW50IG5vZGVDb3VudGVyID0gMDsKLQotCQkJZm9yIChNUElDSDJIb3N0TWFwLkhvc3QgaG9zdCA6IGhvc3RNYXAuZ2V0SG9zdHMoKSkgewotCi0JCQkJLy8gQWRkIG5vZGUgdG8gbW9kZWwKLQkJCQlTdHJpbmcgbm9kZUlkID0gcnRzLmNyZWF0ZU5vZGUobWFjaGluZUlELCBob3N0LmdldE5hbWUoKSwgbm9kZUNvdW50ZXIrKyk7Ci0KLQkJCQkvLyBBZGQgcHJvY2Vzc29yIGluZm9ybWF0aW9uIHRvIG5vZGUuCi0JCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCQkJaWYgKGhvc3QuZ2V0TnVtUHJvY2Vzc29ycygpICE9IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNUElDSDJOb2RlQXR0cmlidXRlcy5nZXROdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShob3N0LmdldE51bVByb2Nlc3NvcnMoKSkpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVGhpcyBzaXR1YXRpb24gaXMgbm90IHBvc3NpYmxlIHNpbmNlIGhvc3QuZ2V0TnVtUHJvY2Vzc29ycygpIGlzIGFsd2F5cyB2YWxpZC4KLQkJCQkJCWFzc2VydCBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlydHMuY2hhbmdlTm9kZShub2RlSWQsIGF0dHJNYW5hZ2VyKTsKLQkJCQlydHMuc2V0Tm9kZUlERm9yTmFtZShob3N0LmdldE5hbWUoKSwgbm9kZUlkKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvKgotCQkJICogU2hvdyBtZXNzYWdlIG9mIGNvcmUgZXhjZXB0aW9uIGFuZCBjaGFuZ2UgbWFjaGluZSBzdGF0dXMgdG8gZXJyb3IuCi0JCQkgKi8KLQkJCWlmIChlLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWFjaGluZUF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpKTsKLQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEZhaWxlZCwgZS5nZXRNZXNzYWdlKCkpKSk7Ci0JCQkJcnRzLmNoYW5nZU1hY2hpbmUobWFjaGluZUlELCBhdHRyTWFuYWdlcik7Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLyoKLQkJCSAqIFNob3cgbWVzc2FnZSBvZiBhbGwgb3RoZXIgZXhjZXB0aW9ucyBhbmQgY2hhbmdlIG1hY2hpbmUgc3RhdHVzIHRvIGVycm9yLgotCQkJICovCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWFjaGluZUF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpKTsKLQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNUElDSDJNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShOTFMuYmluZChNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSW50ZXJuYWxFcnJvciwgZS5nZXRNZXNzYWdlKCkpKSk7Ci0JCQlydHMuY2hhbmdlTWFjaGluZShtYWNoaW5lSUQsIGF0dHJNYW5hZ2VyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkhvc3RNYXAuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkhvc3RNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZDY0Yy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJIb3N0TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkhvc3RNYXAgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSG9zdCB7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PX0VSUk9SUyA9IDA7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUl9OVU1fU0xPVFMgPSAxIDw8IDE7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUl9NQVhfTlVNX1NMT1RTID0gMSA8PCAyOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJfVU5LTk9XTl9BVFRSID0gMSA8PCAzOwotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBhZGRyID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgcG9ydCA9IG51bGw7Ci0JCXByaXZhdGUgaW50IG51bVByb2Nlc3NvcnMgPSAwOwotCQlwcml2YXRlIGludCBtYXhOdW1Qcm9jZXNzb3JzID0gMDsKLQkJcHJpdmF0ZSBpbnQgZXJyb3JzID0gTk9fRVJST1JTOwotCi0JCXB1YmxpYyBIb3N0KFN0cmluZyBob3N0bmFtZSwgU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBwb3J0KSB7Ci0JCQl0aGlzLm5hbWUgPSBob3N0bmFtZTsKLQkJCXRoaXMuYWRkciA9IGFkZHJlc3M7Ci0JCQl0aGlzLnBvcnQgPSBwb3J0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROdW1Qcm9jZXNzb3JzKCkgewotCQkJcmV0dXJuIG51bVByb2Nlc3NvcnM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1heE51bVByb2Nlc3NvcnMoKSB7Ci0JCQlyZXR1cm4gbWF4TnVtUHJvY2Vzc29yczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB7Ci0JCQlyZXR1cm4gYWRkcjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydCgpIHsKLQkJCXJldHVybiBwb3J0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRFcnJvcnMoKSB7Ci0JCQlyZXR1cm4gZXJyb3JzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TnVtUHJvY2Vzc29ycyhpbnQgbnVtUHJvY2Vzc29ycykgewotCQkJdGhpcy5udW1Qcm9jZXNzb3JzID0gbnVtUHJvY2Vzc29yczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE1heE51bVByb2Nlc3NvcnMoaW50IG1heE51bVByb2Nlc3NvcnMpIHsKLQkJCXRoaXMubWF4TnVtUHJvY2Vzc29ycyA9IG1heE51bVByb2Nlc3NvcnM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRFcnJvcnMoaW50IGVycm9ycykgewotCQkJdGhpcy5lcnJvcnMgfD0gZXJyb3JzOwotCQl9Ci0JfQotCi0JTGlzdDxIb3N0PiBob3N0cyA9IG5ldyBBcnJheUxpc3Q8SG9zdD4oKTsKLQlNYXA8U3RyaW5nLCBIb3N0PiBob3N0TmFtZVRvSG9zdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSG9zdD4oKTsKLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMgPSBmYWxzZTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEhvc3QoSG9zdCBob3N0KSB7Ci0JCWhvc3RzLmFkZChob3N0KTsKLQkJaG9zdE5hbWVUb0hvc3QucHV0KGhvc3QuZ2V0TmFtZSgpLCBob3N0KTsKLQl9Ci0KLQlwdWJsaWMgSG9zdFtdIGdldEhvc3RzKCkgewotCQlyZXR1cm4gaG9zdHMudG9BcnJheShuZXcgSG9zdFtob3N0cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8SG9zdD4gZ2V0SG9zdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gaG9zdHMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIEhvc3QgZ2V0SG9zdEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gaG9zdE5hbWVUb0hvc3QuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEhvc3QoU3RyaW5nIG5hbWUsIFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgcG9ydCkgewotCQlNUElDSDJIb3N0TWFwLkhvc3QgaG9zdCA9IG5ldyBNUElDSDJIb3N0TWFwLkhvc3QobmFtZSwgYWRkcmVzcywgcG9ydCk7Ci0JCWFkZEhvc3QoaG9zdCk7Ci0JfQotCi0JcHVibGljIGludCBjb3VudCgpIHsKLQkJcmV0dXJuIGhvc3RzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQYXJzZUVycm9ycygpIHsKLQkJcmV0dXJuIGhhc0Vycm9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJKb2JNYXAuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkpvYk1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDJmZDc2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkpvYk1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgR3JlZyBXYXRzb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJKb2JNYXAgewotCi0JLyoqCi0JICogQW4gTVBJQ0gyIGpvYi4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgSm9iIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpPQklEID0gMSA8PCAwOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSk9CQUxJQVMgPSAxIDw8IDE7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVU0VSTkFNRSA9IDEgPDwgMjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhPU1QgPSAxIDw8IDM7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSUQgPSAxIDw8IDQ7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSUQgPSAxIDw8IDU7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQU5LID0gMSA8PCA2OwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEdNID0gMSA8PCA3OwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgam9iSUQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBqb2JBbGlhcyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7Ci0JCXByaXZhdGUgaW50IHBpZCA9IDA7Ci0JCXByaXZhdGUgaW50IHNpZCA9IDA7Ci0JCXByaXZhdGUgaW50IHJhbmsgPSAwOwotCQlwcml2YXRlIFN0cmluZyBwZ20gPSBudWxsOwotCQlwcml2YXRlIGludCBjb21wbGV0ZTsKLQotCQlwdWJsaWMgSm9iKCkgewotCQkJdGhpcy5jb21wbGV0ZSA9IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBob3N0Ci0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7Ci0JCQlyZXR1cm4gaG9zdDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGpvYklECi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEpvYklEKCkgewotCQkJcmV0dXJuIGpvYklEOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgam9iQWxpYXMKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Sm9iQWxpYXMoKSB7Ci0JCQlyZXR1cm4gam9iQWxpYXM7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBwZ20KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGdtKCkgewotCQkJcmV0dXJuIHBnbTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHBpZAotCQkgKi8KLQkJcHVibGljIGludCBnZXRQaWQoKSB7Ci0JCQlyZXR1cm4gcGlkOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgcmFuawotCQkgKi8KLQkJcHVibGljIGludCBnZXRSYW5rKCkgewotCQkJcmV0dXJuIHJhbms7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBzaWQKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0U2lkKCkgewotCQkJcmV0dXJuIHNpZDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSB1c2VybmFtZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKLQkJCXJldHVybiB1c2VybmFtZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGNvbXBsZXRlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQkJcmV0dXJuIGNvbXBsZXRlID09IChKT0JJRCB8IEpPQkFMSUFTIHwgVVNFUk5BTUUgfCBIT1NUIHwgUElEIHwgU0lEIHwgUkFOSyB8IFBHTSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IEhPU1Q7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gam9iSUQgdGhlIGpvYklEIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Sm9iSUQoU3RyaW5nIGpvYklEKSB7Ci0JCQl0aGlzLmpvYklEID0gam9iSUQ7Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IEpPQklEOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIGpvYkFsaWFzIHRoZSBqb2JBbGlhcyB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEpvYkFsaWFzKFN0cmluZyBqb2JBbGlhcykgewotCQkJdGhpcy5qb2JBbGlhcyA9IGpvYkFsaWFzOwotCQkJdGhpcy5jb21wbGV0ZSB8PSBKT0JBTElBUzsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcGdtIHRoZSBwZ20gdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQZ20oU3RyaW5nIHBnbSkgewotCQkJdGhpcy5wZ20gPSBwZ207Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IFBHTTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBwaWQgdGhlIHBpZCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFBpZChpbnQgcGlkKSB7Ci0JCQl0aGlzLnBpZCA9IHBpZDsKLQkJCXRoaXMuY29tcGxldGUgfD0gUElEOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHJhbmsgdGhlIHJhbmsgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRSYW5rKGludCByYW5rKSB7Ci0JCQl0aGlzLnJhbmsgPSByYW5rOwotCQkJdGhpcy5jb21wbGV0ZSB8PSBSQU5LOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHNpZCB0aGUgc2lkIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2lkKGludCBzaWQpIHsKLQkJCXRoaXMuc2lkID0gc2lkOwotCQkJdGhpcy5jb21wbGV0ZSB8PSBTSUQ7Ci0JCX0KLQkJLyoqCi0JCSAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKLQkJCXRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKLQkJCXRoaXMuY29tcGxldGUgfD0gVVNFUk5BTUU7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZyBzdHIgPSAiSm9iICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghaXNDb21wbGV0ZSgpKSB7Ci0JCQkJc3RyICs9ICIoaW5jb21wbGV0ZSkgWyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJc3RyICs9ICJdIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIEpPQklEKSA9PSBKT0JJRCkgewotCQkJCXN0ciArPSAiIGlkOiAiICsgam9iSUQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBKT0JBTElBUykgPT0gSk9CQUxJQVMpIHsKLQkJCQlzdHIgKz0gIiBhbGlhczogIiArIGpvYkFsaWFzOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgVVNFUk5BTUUpID09IFVTRVJOQU1FKSB7Ci0JCQkJc3RyICs9ICIgdXNlcm5hbWU6IiArIHVzZXJuYW1lOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgSE9TVCkgPT0gSE9TVCkgewotCQkJCXN0ciArPSAiIGhvc3Q6IiArIGhvc3Q7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBQSUQpID09IFBJRCkgewotCQkJCXN0ciArPSAiIHBpZDoiICsgcGlkOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgU0lEKSA9PSBTSUQpIHsKLQkJCQlzdHIgKz0gIiBzaWQ6IiArIHNpZDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIFJBTkspID09IFJBTkspIHsKLQkJCQlzdHIgKz0gIiByYW5rOiIgKyByYW5rOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgUEdNKSA9PSBQR00pIHsKLQkJCQlzdHIgKz0gIiBwZ206IiArIHBnbTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHN0ciArICJdIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8Sm9iPj4gam9ic0J5SUQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Sm9iPj4oKTsKLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMgPSBmYWxzZTsKLQotCXB1YmxpYyBNUElDSDJKb2JNYXAoKSB7Ci0JCS8vIE5vdGhpbmcuCi0JfQotCi0JcHVibGljIHZvaWQgYWRkSm9iKEpvYiBqb2IpIHsKLQkJTGlzdDxKb2I+IGpvYnMgPSBqb2JzQnlJRC5nZXQoam9iLmdldEpvYklEKCkpOwotCQlpZiAoam9icyA9PSBudWxsKSB7Ci0JCQlqb2JzID0gbmV3IEFycmF5TGlzdDxKb2I+KCk7Ci0JCQlqb2JzQnlJRC5wdXQoam9iLmdldEpvYklEKCksIGpvYnMpOwkJCQotCQl9Ci0JCWpvYnMuYWRkKGpvYik7Ci0JfQotCQotCXB1YmxpYyBMaXN0PEpvYj4gZ2V0Sm9iKFN0cmluZyBqb2JJRCkgewotCQlyZXR1cm4gam9ic0J5SUQuZ2V0KGpvYklEKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxMaXN0PEpvYj4+IGdldEpvYnMoKSB7Ci0JCXJldHVybiBqb2JzQnlJRC52YWx1ZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJMaXN0Sm9ic1BhcnNlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyTGlzdEpvYnNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyNWY5Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJMaXN0Sm9ic1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLkRlYnVnVXRpbDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgR3JlZyBXYXRzb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJMaXN0Sm9ic1BhcnNlciB7Ci0JcHVibGljIGVudW0gSm9iTGlzdFN0YXRlIHtKT0JMSVNUX0lOSVQsIEpPQkxJU1RfU1RBUlQsIEpPQkxJU1RfRU5ELCBKT0JMSVNUX0NPTVBMRVRFLCBKT0JMSVNUX0VSUk9SfQotCQotCXByaXZhdGUgSm9iTGlzdFN0YXRlIHN0YXRlOwotCXByaXZhdGUgTVBJQ0gySm9iTWFwIG1hcCA9IG5ldyBNUElDSDJKb2JNYXAoKTsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1zZzsKLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICogQHBhcmFtIGxpbmUKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NKb2JJbmZvKFN0cmluZyBsaW5lLCBNUElDSDJKb2JNYXAuSm9iIGpvYikgewotCQlTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcga2V5OwotCQlTdHJpbmcgdmFsdWU7Ci0KLQkJaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7Ci0JCQlrZXkgPSBwYXJ0c1swXS50cmltKCk7Ci0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09IDIpIHsKLQkJCWtleSA9IHBhcnRzWzBdLnRyaW0oKTsKLQkJCXZhbHVlID0gcGFydHNbMV0udHJpbSgpOwotCQl9IGVsc2UgewotCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9FUlJPUjsKLQkJCWVycm9yTXNnID0gbGluZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCJqb2JpZCIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldEpvYklEKHZhbHVlKTsKLQkJfSBlbHNlIGlmICgiam9iYWxpYXMiLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRKb2JBbGlhcyh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoInVzZXJuYW1lIi5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0VXNlcm5hbWUodmFsdWUpOwotCQl9IGVsc2UgaWYgKCJob3N0Ii5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0SG9zdCh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoInBpZCIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldFBpZChJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0JCX0gZWxzZSBpZiAoInNpZCIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldFNpZChJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0JCX0gZWxzZSBpZiAoInJhbmsiLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRSYW5rKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLQkJfSBlbHNlIGlmICgicGdtIi5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0UGdtKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfRVJST1I7Ci0JCQllcnJvck1zZyA9IGxpbmU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChqb2IuaXNDb21wbGV0ZSgpKSB7Ci0JCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0VORDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTVBJQ0gySm9iTWFwIHBhcnNlKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxpbmUgPSBudWxsOwotCQlNUElDSDJKb2JNYXAuSm9iIGpvYiA9IG51bGw7Ci0KLQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9JTklUOwotCQkKLQkJd2hpbGUgKHN0YXRlICE9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0NPTVBMRVRFKSB7Ci0JCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIEpPQkxJU1RfSU5JVDoKLQkJCQlpZiAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgPT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0NPTVBMRVRFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJbGluZSA9IGxpbmUudHJpbSgpOwotCi0JCQkJaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkvLyBJZ25vcmUgZW1wdHkgbGluZQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX1NUQVJUOwotCi0JCQkJam9iID0gbWFwLm5ldyBKb2IoKTsKLQkJCQlwcm9jZXNzSm9iSW5mbyhsaW5lLCBqb2IpOwotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIEpPQkxJU1RfU1RBUlQ6Ci0JCQkJaWYgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpID09IG51bGwpIHsKLQkJCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlsaW5lID0gbGluZS50cmltKCk7Ci0KLQkJCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfRU5EOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJcHJvY2Vzc0pvYkluZm8obGluZSwgam9iKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgSk9CTElTVF9FTkQ6Ci0JCQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQkJCWlmIChqb2IuaXNDb21wbGV0ZSgpKSB7Ci0JCQkJCQltYXAuYWRkSm9iKGpvYik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HLCAiam9iIGlzIGluY29tcGxldGUsIHNraXBwaW5nIiArIGpvYi50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChsaW5lID09IG51bGwpIHsKLQkJCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9DT01QTEVURTsKLQkJCQl9IGVsc2UgewotCQkJCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0lOSVQ7Ci0JCQkJfQotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICJmb3VuZCBqb2IgIiArIGpvYi50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBKT0JMSVNUX0NPTVBMRVRFOgotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBKT0JMSVNUX0VSUk9SOgotCQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCWVycm9yTXNnICs9ICJcbiIgKyBsaW5lOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbWFwOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvck1zZzsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlBlcmlvZGljSm9iLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJQZXJpb2RpY0pvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGIwODk2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlBlcmlvZGljSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5NYWNoaW5lQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlJNQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJNYWNoaW5lQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0vKioKLSAqIAotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlBlcmlvZGljSm9iIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iIHsKLQlNUElDSDJSdW50aW1lU3lzdGVtIHJ0czsKLQotCXB1YmxpYyBNUElDSDJQZXJpb2RpY0pvYihNUElDSDJSdW50aW1lU3lzdGVtIHJ0cykgewotCQlzdXBlcihydHMsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9uYW1lLCBydHMuZ2V0Um1Db25maWd1cmF0aW9uKCkuZ2V0TmFtZSgpKSwKLQkJCQlydHMucmV0cmlldmVFZmZlY3RpdmVUb29sUm1Db25maWd1cmF0aW9uKCkuZ2V0UGVyaW9kaWNNb25pdG9yQ21kKCksCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJNb25pdG9ySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2UsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9wYXJzaW5nRXJyb3JNZXNzYWdlLAotCQkJCXJ0cy5yZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKS5nZXRQZXJpb2RpY01vbml0b3JUaW1lKCkpOwotCQl0aGlzLnJ0cyA9IHJ0czsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShCdWZmZXJlZFJlYWRlciBvdXRwdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogTVBJIHJlc291cmNlIG1hbmFnZXIgaGF2ZSBvbmx5IG9uZSBtYWNoaW5lIGFuZCBvbmUgcXVldWUuCi0JCSAqIFRoZXJlIHRoZXkgYXJlIGltcGxpY2l0bHkgImRpc2NvdmVyZWQiLgotCQkgKi8KLQkJSVJlc291cmNlTWFuYWdlciBybSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJ0cy5nZXRSbUlEKCkpOwotCQlJUE1hY2hpbmUgbWFjaGluZSA9IHJtLmdldE1hY2hpbmVCeUlkKHJ0cy5nZXRNYWNoaW5lSUQoKSk7Ci0JCUlQUXVldWUgcXVldWUgPSBybS5nZXRRdWV1ZUJ5SWQocnRzLmdldFF1ZXVlSUQoKSk7Ci0JCQotCQkvKgotCQkgKiBXZSBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbW9kZWwgaGFzIGJlZW4gc2V0IHVwIHByb3Blcmx5LiBEbyBub3RoaW5nCi0JCSAqIGlmIHRoaXMgaXMgdGhlIGNhc2UuCi0JCSAqLwotCQlpZiAobWFjaGluZSA9PSBudWxsIHx8IHF1ZXVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qCi0JCSAqIEFueSBleGNlcHRpb24gZnJvbSBub3cgb24gaXMgY2F1Z2h0IGluIG9yZGVyIHRvIGFkZCB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhbiBhdHRyaWJ1dGUgdG8gdGhlIG1hY2hpbmUuCi0JCSAqIFRoZW4sIHRoZSBleGNlcHRpb24gaXMgcmUtdGhyb3duLgotCQkgKi8KLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBQYXJzZSBvdXRwdXQgb2YgbXBkbGlzdGpvYnMgY29tbWFuZC4KLQkJCSAqLwotCQkJTVBJQ0gyTGlzdEpvYnNQYXJzZXIgcGFyc2VyID0gbmV3IE1QSUNIMkxpc3RKb2JzUGFyc2VyKCk7Ci0JCQlNUElDSDJKb2JNYXAgam9iTWFwID0gcGFyc2VyLnBhcnNlKG91dHB1dCk7Ci0JCQlpZiAoam9iTWFwID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIHBhcnNlci5nZXRFcnJvck1lc3NhZ2UoKSkpOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogVXBkYXRlIG1vZGVsIGFjY29yZGluZyB0byBkYXRhLiBGaXJzdCBjcmVhdGUgYW55IG5ldyBqb2JzLgotCQkJICovCi0JCQlmb3IgKExpc3Q8TVBJQ0gySm9iTWFwLkpvYj4gam9icyA6IGpvYk1hcC5nZXRKb2JzKCkpIHsKLQkJCQlmb3IgKE1QSUNIMkpvYk1hcC5Kb2Igam9iIDogam9icykgewotCQkJCQlJUEpvYiBwSm9iID0gcXVldWUuZ2V0Sm9iQnlJZChqb2IuZ2V0Sm9iQWxpYXMoKSk7Ci0JCQkJCWlmIChwSm9iID09IG51bGwpIHsKLQkJCQkJCS8vIE5vdCBvbmUgb2Ygb3VyIGpvYnMKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUlQUHJvY2Vzc0NvbnRyb2wgcHJvY2VzcyA9IChJUFByb2Nlc3NDb250cm9sKXBKb2IuZ2V0UHJvY2Vzc0J5SW5kZXgoam9iLmdldFJhbmsoKSk7Ci0JCQkJCWlmIChwcm9jZXNzICE9IG51bGwgJiYgcHJvY2Vzcy5nZXROb2RlKCkgPT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG5vZGVJRCA9IHJ0cy5nZXROb2RlSURmb3JOYW1lKGpvYi5nZXRIb3N0KCkpOwotCQkJCQkJaWYgKG5vZGVJRCA9PSBudWxsKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBSTUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5NUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZXNEb05vdE1hdGNoLCBudWxsKSk7Ci0JCQkJCQl9Ci0JCQkJCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNcmcgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJCQkJYXR0ck1yZy5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0Tm9kZUlkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShub2RlSUQpKTsKLQkJCQkJCXJ0cy5jaGFuZ2VQcm9jZXNzKHByb2Nlc3MuZ2V0SUQoKSwgYXR0ck1yZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLyoKLQkJCSAqIFNob3cgbWVzc2FnZSBvZiBjb3JlIGV4Y2VwdGlvbiBhbmQgY2hhbmdlIG1hY2hpbmUgc3RhdHVzIHRvIGVycm9yLgotCQkJICovCi0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXR1c01lc3NhZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMk1vbml0b3JKb2JfRXhjZXB0aW9uX0NvbW1hbmRGYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSkpOwotCQkJCXJ0cy5jaGFuZ2VNYWNoaW5lKG1hY2hpbmUuZ2V0SUQoKSwgYXR0ck1hbmFnZXIpOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8qCi0JCQkgKiBTaG93IG1lc3NhZ2Ugb2YgYWxsIG90aGVyIGV4Y2VwdGlvbnMgYW5kIGNoYW5nZSBtYWNoaW5lIHN0YXR1cyB0byBlcnJvci4KLQkJCSAqLwotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvciwgZS5nZXRNZXNzYWdlKCkpKSk7Ci0JCQlydHMuY2hhbmdlTWFjaGluZShtYWNoaW5lLmdldElEKCksIGF0dHJNYW5hZ2VyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW0uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1MjdkMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJSdW50aW1lU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLkFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5FZmZlY3RpdmVNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJSdW50aW1lU3lzdGVtIGV4dGVuZHMgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSB7Ci0KLQkvKiogVGhlIG1hY2hpbmUgd2hlcmUgb3BlbiBtcGkgaXMgcnVubmluZyBvbi4gKi8KLQlwcml2YXRlIFN0cmluZyBtYWNoaW5lSUQ7Ci0JLyoqIFRoZSBxdWV1ZSB0aGF0IGRpc3BhdGNoZXMgam9icyB0byBtcGkuICovCi0JcHJpdmF0ZSBTdHJpbmcgcXVldWVJRDsKLQkvKiogTWFwcGluZyBvZiBkaXNjb3ZlcmVkIGhvc3RzIGFuZCB0aGVpciBJRCBmb3IgSVBOb2RlIGVsZW1lbnRzLiAqLwotCXByaXZhdGUgTWFwPFN0cmluZyxTdHJpbmc+IG5vZGVOYW1lVG9JRE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHVibGljIE1QSUNIMlJ1bnRpbWVTeXN0ZW0oSW50ZWdlciBybWlkLAotCQkJSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgYXR0ckRlZk1ncikgewotCQlzdXBlcihybWlkLCBjb25maWcsIGF0dHJEZWZNZ3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKb2IgY3JlYXRlUnVudGltZVN5c3RlbUpvYihTdHJpbmcgam9iSUQsIFN0cmluZyBxdWV1ZUlELCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IpIHsKLQkJcmV0dXJuIG5ldyBNUElDSDJSdW50aW1lU3lzdGVtSm9iKGpvYklELCBxdWV1ZUlELCBNZXNzYWdlcy5NUElDSDJSdW50aW1lU3lzdGVtX0pvYk5hbWUsIHRoaXMsIGF0dHJNZ3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFjaGluZUlEKCkgewotCQlyZXR1cm4gbWFjaGluZUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUlEZm9yTmFtZShTdHJpbmcgaG9zdG5hbWUpIHsKLQkJcmV0dXJuIG5vZGVOYW1lVG9JRE1hcC5nZXQoaG9zdG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVldWVJRCgpIHsKLQkJcmV0dXJuIHF1ZXVlSUQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbiByZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbihnZXRSbUNvbmZpZ3VyYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZUlERm9yTmFtZShTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBub2RlSUQpIHsKLQkJbm9kZU5hbWVUb0lETWFwLnB1dChob3N0bmFtZSwgbm9kZUlEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9iIGNyZWF0ZUNvbnRpbnVvdXNNb25pdG9ySm9iKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9iIGNyZWF0ZURpc2NvdmVySm9iKCkgewotCQlpZiAoIXJtQ29uZmlndXJhdGlvbi5oYXNEaXNjb3ZlckNtZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKb2Igam9iID0gbmV3IE1QSUNIMkRpc2NvdmVySm9iKHRoaXMpOwotCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJam9iLnNldFN5c3RlbShmYWxzZSk7Ci0JCWpvYi5zZXRVc2VyKGZhbHNlKTsKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9iIGNyZWF0ZVBlcmlvZGljTW9uaXRvckpvYigpIHsKLQkJaWYgKCFybUNvbmZpZ3VyYXRpb24uaGFzUGVyaW9kaWNNb25pdG9yQ21kKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpvYiBqb2IgPSBuZXcgTVBJQ0gyUGVyaW9kaWNKb2IodGhpcyk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQlqb2Iuc2V0U3lzdGVtKGZhbHNlKTsKLQkJam9iLnNldFVzZXIoZmFsc2UpOwotCQlyZXR1cm4gam9iOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0jZG9GaWx0ZXJFdmVudHMob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50LCBib29sZWFuLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9GaWx0ZXJFdmVudHMoSVBFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gZmlsdGVyQ2hpbGRyZW4sIEF0dHJpYnV0ZU1hbmFnZXIgZmlsdGVyQXR0cmlidXRlcykKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90IGltcGxlbWVudGVkIHlldAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSNkb1NodXRkb3duKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1NodXRkb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtI2RvU3RhcnRFdmVudHMoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3RhcnRFdmVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0jZG9TdGFydHVwKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3RhcnR1cChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSNkb1N0b3BFdmVudHMoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3RvcEV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1hY2hpbmVJRChTdHJpbmcgbWFjaGluZUlEKSB7Ci0JCXRoaXMubWFjaGluZUlEID0gbWFjaGluZUlEOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVldWVJRChTdHJpbmcgcXVldWVJRCkgewotCQl0aGlzLnF1ZXVlSUQgPSBxdWV1ZUlEOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwNTU0YS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJSdW50aW1lU3lzdGVtSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJvY2Vzc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuTVBJSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLklucHV0U3RyZWFtTGlzdGVuZXJUb091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5JbnB1dFN0cmVhbU9ic2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gySm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMkxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2IgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iIHsKLQkKLQlwdWJsaWMgT2JqZWN0IGxvY2sxID0gbmV3IE9iamVjdCgpOwotCXByaXZhdGUgSW5wdXRTdHJlYW1PYnNlcnZlciBzdGRlcnJPYnNlcnZlcjsKLQlwcml2YXRlIElucHV0U3RyZWFtT2JzZXJ2ZXIgc3Rkb3V0T2JzZXJ2ZXI7Ci0KLQlwdWJsaWMgTVBJQ0gyUnVudGltZVN5c3RlbUpvYihTdHJpbmcgam9iSUQsIFN0cmluZyBxdWV1ZUlELCBTdHJpbmcgbmFtZSwgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSBydFN5c3RlbSwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB7Ci0JCXN1cGVyKGpvYklELCBxdWV1ZUlELCBuYW1lLCBydFN5c3RlbSwgYXR0ck1ncik7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhbGwgcHJvY2Vzc2VzIHRvIHJ1bm5pbmcgc3RhdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcm9jZXNzZXMoKSB7Ci0JCWZpbmFsIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoTVBJQ0gyUnVudGltZVN5c3RlbSkgZ2V0UnRTeXN0ZW0oKTsKLQkJZmluYWwgSVBKb2IgaXBKb2IgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0JCUludGVnZXJBdHRyaWJ1dGUgbnVtUHJvY3NBdHRyID0gaXBKb2IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZQcm9jZXNzZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlnZXRSdFN5c3RlbSgpLmNyZWF0ZVByb2Nlc3NlcyhnZXRKb2JJRCgpLCBudW1Qcm9jc0F0dHIuZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLQotCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNcmcgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQlhdHRyTXJnLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUuUlVOTklORykpOwotCQlmb3IgKElQUHJvY2VzcyBwcm9jZXNzIDogaXBKb2IuZ2V0UHJvY2Vzc2VzKCkpIHsKLQkJCXJ0U3lzdGVtLmNoYW5nZVByb2Nlc3MocHJvY2Vzcy5nZXRJRCgpLCBhdHRyTXJnKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXJtaW5hdGUgYWxsIHByb2Nlc3Nlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdGVybWluYXRlUHJvY2Vzc2VzKCkgewotCQlmaW5hbCBNUElDSDJSdW50aW1lU3lzdGVtIHJ0U3lzdGVtID0gKE1QSUNIMlJ1bnRpbWVTeXN0ZW0pIGdldFJ0U3lzdGVtKCk7Ci0JCWZpbmFsIElQSm9iIGlwSm9iID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXIocnRTeXN0ZW0uZ2V0Um1JRCgpKS5nZXRRdWV1ZUJ5SWQoZ2V0UXVldWVJRCgpKS5nZXRKb2JCeUlkKGdldEpvYklEKCkpOwotCi0JCS8qCi0JCSAqIE1hcmsgYWxsIHJ1bm5pbmcgYW5kIHN0YXJ0aW5nIHByb2Nlc3NlcyBhcyBmaW5pc2hlZC4KLQkJICovCi0JCUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChJUFByb2Nlc3MgaXBQcm9jZXNzIDogaXBKb2IuZ2V0UHJvY2Vzc2VzKCkpIHsKLQkJCWlmIChpcFByb2Nlc3MuZ2V0U3RhdGUoKSAhPSBQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5DT01QTEVURUQpIHsKLQkJCQlpZHMuYWRkKGlwUHJvY2Vzcy5nZXRJRCgpKTsKLQkJCX0KLQkJfQotCi0JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1yZyA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCWF0dHJNcmcuYWRkQXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5DT01QTEVURUQpKTsKLQkJZm9yIChTdHJpbmcgcHJvY2Vzc0lkIDogaWRzKSB7Ci0JCQlydFN5c3RlbS5jaGFuZ2VQcm9jZXNzKHByb2Nlc3NJZCwgYXR0ck1yZyk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0JlZm9yZUV4ZWN1dGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSZW1vdGVQcm9jZXNzQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoTVBJQ0gyUnVudGltZVN5c3RlbSkgZ2V0UnRTeXN0ZW0oKTsKLQkJZmluYWwgSVBKb2IgaXBKb2IgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRpb25DbGVhblVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZ2V0UHJvY2VzcygpICE9IG51bGwpIHsKLQkJCWdldFByb2Nlc3MoKS5kZXN0cm95KCk7Ci0JCX0KLQkJaWYgKHN0ZGVyck9ic2VydmVyICE9IG51bGwpIHsKLQkJCXN0ZGVyck9ic2VydmVyLmtpbGwoKTsKLQkJCXN0ZGVyck9ic2VydmVyID0gbnVsbDsKLQkJfQotCQlpZiAoc3Rkb3V0T2JzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc3Rkb3V0T2JzZXJ2ZXIua2lsbCgpOwotCQkJc3Rkb3V0T2JzZXJ2ZXIgPSBudWxsOwotCQl9Ci0JCS8vIFRPRE86IG1vcmUgY2xlYW51cD8KLQkJdGVybWluYXRlUHJvY2Vzc2VzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRpb25GaW5pc2hlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGVybWluYXRlUHJvY2Vzc2VzKCk7Ci0JCWlmIChnZXRQcm9jZXNzKCkuZXhpdFZhbHVlKCkgIT0gMCkgewotCQkJaWYgKCF0ZXJtaW5hdGVKb2JGbGFnKSB7Ci0JCQkJY2hhbmdlSm9iU3RhdHVzTWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy5NUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25GYWlsZWRXaXRoRXhpdFZhbHVlLCBuZXcgSW50ZWdlcihnZXRQcm9jZXNzKCkuZXhpdFZhbHVlKCkpKSk7Ci0JCQkJY2hhbmdlSm9iU3RhdHVzKE1QSUpvYkF0dHJpYnV0ZXMuU3RhdHVzLkVSUk9SKTsKLQkJCX0KLQkJCQotCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkcsICJSVFMgam9iICN7MH06IGlnbm9yaW5nIGV4aXQgdmFsdWUgezF9IGJlY2F1c2Ugam9iIHdhcyBmb3JjZWQgdG8gdGVybWluYXRlIGJ5IHVzZXIiLCBnZXRKb2JJRCgpLCBuZXcgSW50ZWdlcihnZXRQcm9jZXNzKCkuZXhpdFZhbHVlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRpb25TdGFydGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBNUElDSDJSdW50aW1lU3lzdGVtIHJ0U3lzdGVtID0gKE1QSUNIMlJ1bnRpbWVTeXN0ZW0pIGdldFJ0U3lzdGVtKCk7Ci0JCWZpbmFsIElQSm9iIGlwSm9iID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXIocnRTeXN0ZW0uZ2V0Um1JRCgpKS5nZXRRdWV1ZUJ5SWQoZ2V0UXVldWVJRCgpKS5nZXRKb2JCeUlkKGdldEpvYklEKCkpOwotCi0JCWluaXRpYWxpemVQcm9jZXNzZXMoKTsKLQotCQkvKgotCQkgKiBMaXN0ZW5lciB0aGF0IHNhdmVzIHN0ZG91dC4KLQkJICovCi0JCWZpbmFsIFBpcGVkT3V0cHV0U3RyZWFtIHN0ZG91dE91dHB1dFN0cmVhbSA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwotCQlmaW5hbCBQaXBlZElucHV0U3RyZWFtIHN0ZG91dElucHV0U3RyZWFtID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXN0ZG91dElucHV0U3RyZWFtLmNvbm5lY3Qoc3Rkb3V0T3V0cHV0U3RyZWFtKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0IGZhbHNlOyAvLyBUaGlzIGV4Y2VwdGlvbiBpcyBub3QgcG9zc2libGUKLQkJfQotCQlmaW5hbCBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0gc3Rkb3V0UGlwZWRTdHJlYW1MaXN0ZW5lciA9IG5ldyBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0oc3Rkb3V0T3V0cHV0U3RyZWFtKTsKLQotCQlUaHJlYWQgc3Rkb3V0VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHN0ZG91dCB0aHJlYWQ6IHN0YXJ0ZWQiLCBnZXRKb2JJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCUJ1ZmZlcmVkUmVhZGVyIHN0ZG91dEJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdGRvdXRJbnB1dFN0cmVhbSkpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBsaW5lID0gc3Rkb3V0QnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWludCBwb3MgPSBsaW5lLmluZGV4T2YoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwb3MgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUuc3Vic3RyaW5nKDAsIHBvcykpOwotCQkJCQkJCQlsaW5lID0gbGluZS5zdWJzdHJpbmcocG9zKzEpOwotCQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXN5bmNocm9uaXplZCAobG9jazEpIHsKLQkJCQkJCQlJUFByb2Nlc3MgaXBQcm9jID0gaXBKb2IuZ2V0UHJvY2Vzc0J5SW5kZXgoaW5kZXgpOwotCQkJCQkJCWlmIChpcFByb2MgIT0gbnVsbCkgewotCQkJCQkJCQlpcFByb2MuYWRkQXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0ZG91dEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobGluZSkpOwotCQkJCQkJCX0KLQkJCQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfT1VUUFVUX1RSQUNJTkcsICJSVFMgam9iICN7MH06PiB7MX0iLCBnZXRKb2JJRCgpLCBsaW5lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJbGluZSA9IHN0ZG91dEJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHN0ZG91dCB0aHJlYWQ6IHswfSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCU1QSUNIMlBsdWdpbi5sb2coZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3Rkb3V0UGlwZWRTdHJlYW1MaXN0ZW5lci5kaXNhYmxlKCk7Ci0JCQkJfQotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHN0ZG91dCB0aHJlYWQ6IGZpbmlzaGVkIiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQotCQkvKgotCQkgKiBMaXN0ZW5lciB0aGF0IHNhdmVzIHN0ZGVyci4KLQkJICovCi0JCWZpbmFsIFBpcGVkT3V0cHV0U3RyZWFtIHN0ZGVyck91dHB1dFN0cmVhbSA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwotCQlmaW5hbCBQaXBlZElucHV0U3RyZWFtIHN0ZGVycklucHV0U3RyZWFtID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXN0ZGVycklucHV0U3RyZWFtLmNvbm5lY3Qoc3RkZXJyT3V0cHV0U3RyZWFtKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0IGZhbHNlOyAvLyBUaGlzIGV4Y2VwdGlvbiBpcyBub3QgcG9zc2libGUKLQkJfQotCQlmaW5hbCBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0gc3RkZXJyUGlwZWRTdHJlYW1MaXN0ZW5lciA9IG5ldyBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0oc3RkZXJyT3V0cHV0U3RyZWFtKTsKLQkJVGhyZWFkIHN0ZGVyclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRlcnIgdGhyZWFkOiBzdGFydGVkIiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBzdGRlcnJCdWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RkZXJySW5wdXRTdHJlYW0pKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbGluZSA9IHN0ZGVyckJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCXdoaWxlIChsaW5lICE9IG51bGwpIHsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlpbnQgcG9zID0gbGluZS5pbmRleE9mKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zID4gMCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygwLCBwb3MpKTsKLQkJCQkJCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKHBvcysxKTsKLQkJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2sxKSB7Ci0JCQkJCQkJSVBQcm9jZXNzIGlwUHJvYyA9IGlwSm9iLmdldFByb2Nlc3NCeUluZGV4KGluZGV4KTsKLQkJCQkJCQlpZiAoaXBQcm9jICE9IG51bGwpIHsKLQkJCQkJCQkJaXBQcm9jLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRlcnJBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGxpbmUpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJRGVidWdVdGlsLmVycm9yKERlYnVnVXRpbC5SVFNfSk9CX09VVFBVVF9UUkFDSU5HLCAiUlRTIGpvYiAjezB9Oj4gezF9IiwgZ2V0Sm9iSUQoKSwgbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWxpbmUgPSBzdGRlcnJCdWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRlcnIgdGhyZWFkOiB7MX0iLCBnZXRKb2JJRCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlNUElDSDJQbHVnaW4ubG9nKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN0ZGVyclBpcGVkU3RyZWFtTGlzdGVuZXIuZGlzYWJsZSgpOwotCQkJCX0KLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRlcnIgdGhyZWFkOiBmaW5pc2hlZCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3RhcnRpbmcgYWxsIHRocmVhZHMiLCBnZXRKb2JJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBDcmVhdGUgYW5kIHN0YXJ0IGxpc3RlbmVycy4KLQkJICovCi0JCXN0ZG91dFRocmVhZC5zdGFydCgpOwotCQlzdGRlcnJUaHJlYWQuc3RhcnQoKTsKLQotCQlzdGRlcnJPYnNlcnZlciA9IG5ldyBJbnB1dFN0cmVhbU9ic2VydmVyKGdldFByb2Nlc3MoKS5nZXRFcnJvclN0cmVhbSgpKTsKLQkJc3Rkb3V0T2JzZXJ2ZXIgPSBuZXcgSW5wdXRTdHJlYW1PYnNlcnZlcihnZXRQcm9jZXNzKCkuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0KLQkJc3Rkb3V0T2JzZXJ2ZXIuYWRkTGlzdGVuZXIoc3Rkb3V0UGlwZWRTdHJlYW1MaXN0ZW5lcik7Ci0JCXN0ZGVyck9ic2VydmVyLmFkZExpc3RlbmVyKHN0ZGVyclBpcGVkU3RyZWFtTGlzdGVuZXIpOwotCi0JCXN0ZGVyck9ic2VydmVyLnN0YXJ0KCk7Ci0JCXN0ZG91dE9ic2VydmVyLnN0YXJ0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9QcmVwYXJlRXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGU8PywgPywgPz5bXSBkb1JldHJpZXZlVG9vbEJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIG1ha2UgbWFjcm9zIGF2YWlsYWJsZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB3b3JrIGRpcmVjdG9yeS4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGU8PywgPywgPz5bXSBkb1JldHJpZXZlVG9vbENvbW1hbmRTdWJzdGl0dXRpb25BdHRyaWJ1dGVzKAotCQkJQXR0cmlidXRlTWFuYWdlciBiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlciwKLQkJCVN0cmluZyBkaXJlY3RvcnksIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQpIHsKLQotCQlMaXN0PElBdHRyaWJ1dGU8PywgPywgPz4+IG5ld0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGU8Pyw/LD8+PigpOwotCi0JCS8qCi0JCSAqIEFuIE1QSUNIMiBzcGVjaWZpYyBhdHRyaWJ1dGUuCi0JCSAqIEF0dHJpYnV0ZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBuYW1lcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0JCSAqLwotCQlpbnQgcCA9IDA7Ci0JCVN0cmluZyBrZXlzW10gPSBuZXcgU3RyaW5nW2Vudmlyb25tZW50LnNpemUoKV07Ci0JCWZvciAoU3RyaW5nIGtleSA6IGVudmlyb25tZW50LmtleVNldCgpKSB7Ci0JCQlrZXlzW3ArK10gPSBrZXk7Ci0JCX0KLQkJbmV3QXR0cmlidXRlcy5hZGQoTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5nZXRFbnZpcm9ubWVudEtleXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGtleXMpKTsKLQotCQkvKgotCQkgKiBBbiBNUElDSDIgc3BlY2lmaWMgYXR0cmlidXRlLgotCQkgKiBBIHNob3J0Y3V0IHRoYXQgZ2VuZXJhdGVzIGFyZ3VtZW50cyBmb3IgdGhlIE1QSUNIMiBydW4gY29tbWFuZC4KLQkJICovCi0JCW5ld0F0dHJpYnV0ZXMuYWRkKE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXMuZ2V0RW52aXJvbm1lbnRBcmdzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpKTsKLQkJCi0JCS8qCi0JCSAqIFRoZSBqb2JpZCBpcyB1c2VkIHRvIGFsaWFzIHRoZSBNUElDSDIgam9iIHNvIHRoYXQgaXQgY2FuIGJlIG1hdGNoZWQgbGF0ZXIuCi0JCSAqLwotCQluZXdBdHRyaWJ1dGVzLmFkZChNUElDSDJKb2JBdHRyaWJ1dGVzLmdldEpvYklkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShnZXRKb2JJRCgpKSk7Ci0JCQotCQlyZXR1cm4gbmV3QXR0cmlidXRlcy50b0FycmF5KG5ldyBJQXR0cmlidXRlPD8sID8sID8+W25ld0F0dHJpYnV0ZXMuc2l6ZSgpXSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRvUmV0cmlldmVUb29sRW52aXJvbm1lbnQoKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm8gZXh0cmEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5lZWRzIHRvIGJlIHNldCBmb3IgTVBJQ0gyLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1Rlcm1pbmF0ZUpvYigpIHsKLQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9XYWl0RXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBXYWl0IHVudGlsIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgc3RvcCBiZWNhdXNlIHN0cmVhbSBhcmUgY2xvc2VkLgotCQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHByb2Nlc3MgaGFzIGZpbmlzaGVkLgotCQkgKi8KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogd2FpdGluZyBzdGRlcnIgdGhyZWFkIHRvIGZpbmlzaCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzdGRlcnJPYnNlcnZlci5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXRpbmcgc3Rkb3V0IHRocmVhZCB0byBmaW5pc2giLCBnZXRKb2JJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJc3Rkb3V0T2JzZXJ2ZXIuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQotCQkvKgotCQkgKiBTdGlsbCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHJlbW90ZSBwcm9jZXNzIG1pZ2h0IG5vdCBoYXZlIHlldCB0ZXJtaW5hdGVkLCBhbHRob3VnaCBzdGRvdXQgYW5kIHN0ZGVyciBpcyBjbG9zZWQuCi0JCSAqLwotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiB3YWl0aW5nIG1waSBwcm9jZXNzIHRvIGZpbmlzaCBjb21wbGV0ZWx5IiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWdldFByb2Nlc3MoKS53YWl0Rm9yKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogY29tcGxldGVseSBmaW5pc2hlZCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJUcmFjZVBhcnNlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyVHJhY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0MzNjMC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJUcmFjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotCi0vKioKLSAqIAotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlRyYWNlUGFyc2VyIHsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgTVBJQ0gySG9zdE1hcCBtYXAgPSBuZXcgTVBJQ0gySG9zdE1hcCgpOwotCXByaXZhdGUgc3RhdGljIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKFteX10rKV8oWzAtOV0pKyBcXCgoWzAtOS5dKylcXCkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgbXBkdHJhY2UgY29tbWFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogQHJldHVybiBhbiBNUElDSDJIb3N0TWFwIGNvbnRhaW5pbmcgdGhlIGtub3duIGhvc3RzLCBvciBudWxsIGlmIHRoZXJlIHdhcyBhbiBlcnJvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTVBJQ0gySG9zdE1hcCBwYXJzZShCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1QSUNIMlRyYWNlUGFyc2VyIHBhcnNlciA9IG5ldyBNUElDSDJUcmFjZVBhcnNlcigpOwotCQlTdHJpbmcgbGluZTsKLQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKLQotCQkJaWYgKGxpbmUubGVuZ3RoKCk9PTApIHsKLQkJCQkvLyBJZ25vcmUgZW1wdHkgbGluZQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0JCQlpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBQcm9iYWJseSBhbiBlcnJvciBmcm9tIG1wZHRyYWNlLiBDb2xsZWN0IGxpbmVzIGFuZCBtYXJrIGVycm9yLgotCQkJCSAqLwotCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkJZXJyb3JNZXNzYWdlICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAobWF0Y2hlci5tYXRjaGVzKCkgJiYgbWF0Y2hlci5ncm91cENvdW50KCkgPT0gMykgewotCQkJCVN0cmluZyBob3N0ID0gbWF0Y2hlci5ncm91cCgxKTsKLQkJCQlTdHJpbmcgcG9ydCA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0JCQkJU3RyaW5nIGFkZHIgPSBtYXRjaGVyLmdyb3VwKDMpOwotCQkJCXBhcnNlci5tYXAuYWRkSG9zdChob3N0LCBhZGRyLCBwb3J0KTsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HLCAiZm91bmQgaG9zdCAiICsgaG9zdCArICIgYWRkciAiICsgYWRkciArICIgcG9ydCAiICsgcG9ydCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJzZXIubWFwOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTNlNjguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjIxMjYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWUzNTQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNNb24gT2N0IDA2IDE0OjM2OjQ0IEdNVC0wMzowMCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOWJjZTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuTVBJQ0gyVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51aSwKLSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHMKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhM2I5MS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBkYXRhLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2RhdGEvbGF1bmNoLWRlZmF1bHRzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvZGF0YS9sYXVuY2gtZGVmYXVsdHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1YTMyYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvZGF0YS9sYXVuY2gtZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU5VTVBST0NTPTEKLU5PTE9DQUw9ZmFsc2UKLVBSRUZJWD0KLVVTRVBSRUZJWD1mYWxzZQotSE9TVEZJTEU9Ci1VU0VIT1NURklMRT1mYWxzZQotSE9TVExJU1Q9Ci1VU0VIT1NUTElTVD1mYWxzZQotQVJHVU1FTlRTPQotVVNFREVGQVVMVEFSR1VNRU5UUz10cnVlCi1VU0VERUZBVUxUUEFSQU1FVEVSUz10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZiZjFmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgTVBJQ0gyIChuZXcpIFVJCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNDFkNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucm1MYXVuY2hDb25maWd1cmF0aW9ucyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaC5NUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIudWkubGF1bmNoQ29uZmlndXJhdGlvbiIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLnByb3ZpZGVyQ29udHJpYnV0b3JzIj4KLSAgICAgIDxwcm92aWRlckNvbnRyaWJ1dG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuTVBJQ0gyUHJvdmlkZXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5NUElDSDJTZXJ2aWNlUHJvdmlkZXIiPgotICAgICAgPC9wcm92aWRlckNvbnRyaWJ1dG9yPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnVpLnJ1bnRpbWVNb2RlbFByZXNlbnRhdGlvbnMiPgotICAgICAgPHJ1bnRpbWVNb2RlbFByZXNlbnRhdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLk1QSUNIMlJ1bnRpbWVNb2RlbFByZXNlbnRhdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5NUElDSDJTZXJ2aWNlUHJvdmlkZXIiPgotICAgICAgPC9ydW50aW1lTW9kZWxQcmVzZW50YXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9NUElDSDJQcm92aWRlckNvbnRyaWJ1dG9yLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL01QSUNIMlByb3ZpZGVyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMjI1ZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL01QSUNIMlByb3ZpZGVyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS53aXphcmRzLk1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS53aXphcmRzLk1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLklSTUNvbmZpZ3VyYXRpb25XaXphcmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBNUElDSDJQcm92aWRlckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yIA0KLXsNCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IjY29uZmlndXJlU2VydmljZVByb3ZpZGVyKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVNlcnZpY2VQcm92aWRlcihJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyLCBDb21wb3NpdGUgY29tcCkgDQotCXsNCi0JCS8vIE5vdGhpbmcNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciNnZXRXaXphcmQob3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlciwgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQ0KLQkgKi8NCi0JcHVibGljIElXaXphcmQgZ2V0V2l6YXJkKElTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIsIElXaXphcmRQYWdlIHBhZ2UpIHsNCi0JCXJldHVybiBuZXcgUk1TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkKHByb3ZpZGVyLCBwYWdlKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciNnZXRXaXphcmRQYWdlcyhvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCwgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcikNCi0JICovDQotCXB1YmxpYyBXaXphcmRQYWdlW10gZ2V0V2l6YXJkUGFnZXMoSVdpemFyZCB3aXphcmQsIElTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIpIA0KLQl7DQotCQlXaXphcmRQYWdlIHdpemFyZFBhZ2VzW107DQotCQkNCi0JCXdpemFyZFBhZ2VzID0gbmV3IFdpemFyZFBhZ2VbMl07DQotCQl3aXphcmRQYWdlc1swXSA9IG5ldyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKChJUk1Db25maWd1cmF0aW9uV2l6YXJkKXdpemFyZCk7DQotCQl3aXphcmRQYWdlc1sxXSA9IG5ldyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSgoSVJNQ29uZmlndXJhdGlvbldpemFyZCl3aXphcmQpOw0KLQkJcmV0dXJuIHdpemFyZFBhZ2VzOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvTVBJQ0gyUnVudGltZU1vZGVsUHJlc2VudGF0aW9uLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL01QSUNIMlJ1bnRpbWVNb2RlbFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYzMGE4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvTVBJQ0gyUnVudGltZU1vZGVsUHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkuUk1Nb2RlbEltYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklSdW50aW1lTW9kZWxQcmVzZW50YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBNUElDSDJSdW50aW1lTW9kZWxQcmVzZW50YXRpb24gaW1wbGVtZW50cyBJUnVudGltZU1vZGVsUHJlc2VudGF0aW9uIHsNCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JUnVudGltZU1vZGVsUHJlc2VudGF0aW9uI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElFbGVtZW50KSB7DQotCQkJSUVsZW1lbnQgZWxlbWVudCA9IChJRWxlbWVudClvYmplY3Q7DQotCQkJSVBFbGVtZW50IHBFbGVtZW50ID0gZWxlbWVudC5nZXRQRWxlbWVudCgpOw0KLQkJCWlmIChwRWxlbWVudCBpbnN0YW5jZW9mIElQUHJvY2Vzcykgew0KLQkJCQlTdHJpbmdBdHRyaWJ1dGUgc3RhdHVzID0gcEVsZW1lbnQuZ2V0QXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0YXR1c0F0dHJpYnV0ZURlZmluaXRpb24oKSk7DQotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgew0KLQkJCQkJaWYgKGVsZW1lbnQuaXNTZWxlY3RlZCgpKSB7DQotCQkJCQkJcmV0dXJuIFJNTW9kZWxJbWFnZXMucHJvY1NlbEltYWdlcy5nZXQoc3RhdHVzLmdldFZhbHVlKCkpOw0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIFJNTW9kZWxJbWFnZXMucHJvY0ltYWdlcy5nZXQoc3RhdHVzLmdldFZhbHVlKCkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUEpvYikgew0KLQkJCUlQSm9iIGpvYiA9IChJUEpvYilvYmplY3Q7DQotCQkJU3RyaW5nQXR0cmlidXRlIHN0YXR1cyA9IGpvYi5nZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdHVzQXR0cmlidXRlRGVmaW5pdGlvbigpKTsNCi0JCQlpZiAoc3RhdHVzICE9IG51bGwpIHsNCi0JCQkJaWYgKGpvYi5pc0RlYnVnKCkpIHsNCi0JCQkJCXJldHVybiBSTU1vZGVsSW1hZ2VzLmpvYkRlYnVnSW1hZ2VzLmdldChzdGF0dXMuZ2V0VmFsdWUoKSk7DQotCQkJCX0NCi0JCQkJcmV0dXJuIFJNTW9kZWxJbWFnZXMuam9iSW1hZ2VzLmdldChzdGF0dXMuZ2V0VmFsdWUoKSk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JUnVudGltZU1vZGVsUHJlc2VudGF0aW9uI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlJUEVsZW1lbnQgZWxlbWVudCA9IG51bGw7DQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUVsZW1lbnQpIHsNCi0JCQllbGVtZW50ID0gKChJRWxlbWVudClvYmplY3QpLmdldFBFbGVtZW50KCk7DQotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQRWxlbWVudCkgew0KLQkJCWVsZW1lbnQgPSAoSVBFbGVtZW50KW9iamVjdDsNCi0JCX0NCi0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsNCi0JCQlTdHJpbmdBdHRyaWJ1dGUgc3RhdHVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdHVzQXR0cmlidXRlRGVmaW5pdGlvbigpKTsNCi0JCQlpZiAoc3RhdHVzICE9IG51bGwpIHsNCi0JCQkJcmV0dXJuIHN0YXR1cy5nZXRWYWx1ZSgpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvTVBJQ0gyVUlQbHVnaW4uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvTVBJQ0gyVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3NzIyMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL01QSUNIMlVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5STUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoLk1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIE1QSUNIMlVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBNUElDSDJVSVBsdWdpbigpIHsKLQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLmxvYWREZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1QSUNIMlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmFpc2UgY29yZSBleGNlcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGNvcmVFcnJvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBSTUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBtZXNzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogUmFpc2UgY29yZSBleGNlcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVFeGNlcHRpb24gY29yZUVycm9yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBSTUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBtZXNzYWdlLCB0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGFuIElTdGF0dXMKLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBzdHJpbmcKLQkgKgotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBUaHJvd2FibGUKLQkgKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLk1QSUNIMlVJUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yLCBlKSk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgYSB1bmlxdWUgaWRlbnRpZmllcgotCSAqCi0JICogQHJldHVybiB1bmlxdWUgaWRlbnRpZmllciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpCi0JCQkvLyBJZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLAotCQkJLy8gcmV0dXJuIGEgc3RhdGljIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBtdXN0Ci0JCQkvLyBtYXRjaCB0aGUgcGx1Z2luIGlkIGRlZmluZWQgaW4gcGx1Z2luLnhtbAotCQkJcmV0dXJuIFBMVUdJTl9JRDsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0FkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdlOGJlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0FkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5sYXVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLlJNTGF1bmNoVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5NUElDSDJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLkJhc2VSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBleHRlbmRzCi1CYXNlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB7Ci0KLQlDb21wb3NpdGUgY29udHJvbDsKLQlCdXR0b24gdXNlQXJnc0RlZmF1bHRzQnV0dG9uOwotCVRleHQgYXJnc1RleHQ7Ci0KLQljbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lcgotCWltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyBXaWRnZXRMaXN0ZW5lcihCYXNlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBkeW5hbWljVGFiKSB7Ci0JCQlzdXBlcihkeW5hbWljVGFiKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQljbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgewotCQlwcml2YXRlIGJvb2xlYW4gdXNlRGVmQXJnczsKLQkJcHJpdmF0ZSBTdHJpbmcgYXJnczsKLQotCQlwcm90ZWN0ZWQgRGF0YVNvdXJjZShCYXNlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbUZpZWxkcygpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCXVzZURlZkFyZ3MgPSB1c2VBcmdzRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlhcmdzID0gZXh0cmFjdFRleHQoYXJnc1RleHQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb0ZpZWxkcygpIHsKLQkJCWFwcGx5VGV4dChhcmdzVGV4dCwgYXJncyk7Ci0JCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZkFyZ3MpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb1N0b3JhZ2UoKSB7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoCi0JCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTLAotCQkJCQl1c2VEZWZBcmdzKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZSgKLQkJCQkJTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywgYXJncyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZERlZmF1bHQoKSB7Ci0JCQlhcmdzID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfQVJHVU1FTlRTOwotCQkJdXNlRGVmQXJncyA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFM7Ci0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7Ci0JCQl0cnkgewotCQkJCWFyZ3MgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKAotCQkJCQkJTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywKLQkJCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0FSR1VNRU5UUyk7Ci0JCQkJdXNlRGVmQXJncyA9IGdldENvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUywKLQkJCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBoYW5kbGUgZXhjZXB0aW9uPwotCQkJCU1QSUNIMlVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJaWYgKCF1c2VEZWZBcmdzICYmIGFyZ3MgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKAotCQkJCQkJTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlBcmd1bWVudHMpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnZlcnQgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbnRvIG9uZSBob3N0IHBlciBsaW5lCi0JCSAqIAotCQkgKiBAcGFyYW0gbGlzdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBob3N0TGlzdFRvVGV4dChTdHJpbmcgbGlzdCkgewotCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gdmFsdWVzID0gbGlzdC5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghdmFsdWVzW2ldLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCXJlc3VsdCArPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmVzdWx0ICs9IHZhbHVlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBuZXcgRGF0YVNvdXJjZSh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldExpc3RlbmVyKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwKLQkJCUlQUXVldWUgcXVldWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWZpbmFsIEdyb3VwIGFyZ3VtZW50c0dyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJYXJndW1lbnRzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsCi0JCQkJZmFsc2UpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWFyZ3VtZW50c0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlhcmd1bWVudHNHcm91cAotCQkuc2V0VGV4dChNZXNzYWdlcy5BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTGF1bmNoQXJndW1lbnRzKTsKLQotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKGFyZ3VtZW50c0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24KLQkJLnNldFRleHQoTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRBcmd1bWVudHMpOwotCQkvLyB1c2VBcmdzRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVzZUFyZ3NEZWZhdWx0c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChhcmd1bWVudHNHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJbGFiZWwKLQkJLnNldFRleHQoTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0FyZ3VtZW50cyk7Ci0KLQkJYXJnc1RleHQgPSBuZXcgVGV4dChhcmd1bWVudHNHcm91cCwgU1dULkJPUkRFUik7Ci0JCWFyZ3NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCX0KLQotCXB1YmxpYyBJQXR0cmlidXRlPD8sID8sID8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gc2V0RGVmYXVsdHMoCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JCQlJUFF1ZXVlIHF1ZXVlKSB7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKAotCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTLAotCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfQVJHVU1FTlRTLAotCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0FSR1VNRU5UUyk7Ci0JCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlhcmdzVGV4dC5zZXRFbmFibGVkKCF1c2VBcmdzRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0Jhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NzhkY2QuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuUk1MYXVuY2hWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyTGF1bmNoQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5NUElDSDJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLkJhc2VSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLlBpeGVsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGV4dGVuZHMgQmFzZVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgewotCi0JQ29tcG9zaXRlIGNvbnRyb2w7Ci0JU3Bpbm5lciBudW1Qcm9jc1NwaW5uZXI7Ci0JQnV0dG9uIG5vTG9jYWxCdXR0b247Ci0JQnV0dG9uIHVzZVByZWZpeEJ1dHRvbjsKLQlUZXh0IHByZWZpeFRleHQ7Ci0JVGV4dCBob3N0RmlsZVRleHQ7Ci0JQnV0dG9uIGhvc3RGaWxlQnV0dG9uOwotCVRleHQgaG9zdExpc3RUZXh0OwotCUJ1dHRvbiBob3N0TGlzdEJ1dHRvbjsKLQlCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXIgewotCQlwdWJsaWMgV2lkZ2V0TGlzdGVuZXIoQmFzZVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZHluYW1pY1RhYikgewotCQkJc3VwZXIoZHluYW1pY1RhYik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9Nb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IG51bVByb2NzU3Bpbm5lciB8fCBlLmdldFNvdXJjZSgpID09IHByZWZpeFRleHQgfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0RmlsZVRleHQgfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0TGlzdFRleHQpIHsKLQkJCQkvLwkJCQlnZXREYXRhU291cmNlKCkuanVzdFZhbGlkYXRlKCk7Ci0JCQl9IGVsc2V7Ci0JCQkJc3VwZXIuZG9Nb2RpZnlUZXh0KGUpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gbm9Mb2NhbEJ1dHRvbiB8fCBlLmdldFNvdXJjZSgpID09IHVzZVByZWZpeEJ1dHRvbikgewotCQkJCS8vCQkJCWdldERhdGFTb3VyY2UoKS5qdXN0VmFsaWRhdGUoKTsKLQkJCX0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSB1c2VQcmVmaXhCdXR0b24gfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0RmlsZUJ1dHRvbiB8fCBlLmdldFNvdXJjZSgpID09IGhvc3RMaXN0QnV0dG9uKSB7Ci0JCQkJLy8JCQkJZ2V0RGF0YVNvdXJjZSgpLmp1c3RWYWxpZGF0ZSgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgewotCi0JCXByaXZhdGUgaW50IG51bVByb2NzOwotCQlwcml2YXRlIGJvb2xlYW4gbm9Mb2NhbDsKLQkJcHJpdmF0ZSBib29sZWFuIHVzZVByZWZpeDsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJlZml4OwotCQlwcml2YXRlIGJvb2xlYW4gdXNlSG9zdEZpbGU7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3RGaWxlOwotCQlwcml2YXRlIGJvb2xlYW4gdXNlSG9zdExpc3Q7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3RMaXN0OwotCi0JCXByb3RlY3RlZCBEYXRhU291cmNlKEJhc2VSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHBhZ2UpIHsKLQkJCXN1cGVyKHBhZ2UpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlGcm9tRmllbGRzKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJbnVtUHJvY3MgPSBudW1Qcm9jc1NwaW5uZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlub0xvY2FsID0gbm9Mb2NhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCXVzZVByZWZpeCA9IHVzZVByZWZpeEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCXByZWZpeCA9IGV4dHJhY3RUZXh0KHByZWZpeFRleHQpOwotCQkJdXNlSG9zdEZpbGUgPSBob3N0RmlsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCWhvc3RGaWxlID0gZXh0cmFjdFRleHQoaG9zdEZpbGVUZXh0KTsKLQkJCXVzZUhvc3RMaXN0ID0gaG9zdExpc3RCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlob3N0TGlzdCA9IGV4dHJhY3RUZXh0KGhvc3RMaXN0VGV4dCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weVRvRmllbGRzKCkgewotCQkJbnVtUHJvY3NTcGlubmVyLnNldFNlbGVjdGlvbihudW1Qcm9jcyk7Ci0JCQlub0xvY2FsQnV0dG9uLnNldFNlbGVjdGlvbihub0xvY2FsKTsKLQkJCXVzZVByZWZpeEJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlUHJlZml4KTsKLQkJCWFwcGx5VGV4dChwcmVmaXhUZXh0LCBwcmVmaXgpOwotCQkJYXBwbHlUZXh0KGhvc3RGaWxlVGV4dCwgaG9zdEZpbGUpOwotCQkJaG9zdEZpbGVCdXR0b24uc2V0U2VsZWN0aW9uKHVzZUhvc3RGaWxlKTsKLQkJCWFwcGx5VGV4dChob3N0TGlzdFRleHQsIGhvc3RMaXN0VG9UZXh0KGhvc3RMaXN0KSk7Ci0JCQlob3N0TGlzdEJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlSG9zdExpc3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb1N0b3JhZ2UoKSB7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05VTVBST0NTLCBudW1Qcm9jcyk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05PTE9DQUwsIG5vTG9jYWwpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VQUkVGSVgsIHVzZVByZWZpeCk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1BSRUZJWCwgcHJlZml4KTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVEZJTEUsIHVzZUhvc3RGaWxlKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVEZJTEUsIGhvc3RGaWxlKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVExJU1QsIHVzZUhvc3RMaXN0KTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVExJU1QsIGhvc3RMaXN0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVmYXVsdCgpIHsKLQkJCW51bVByb2NzID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTlVNUFJPQ1M7Ci0JCQlub0xvY2FsID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9MT0NBTDsKLQkJCXVzZVByZWZpeCA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRVBSRUZJWDsKLQkJCXByZWZpeCA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BSRUZJWDsKLQkJCWhvc3RGaWxlID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVEZJTEU7Ci0JCQl1c2VIb3N0RmlsZSA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RGSUxFOwotCQkJaG9zdExpc3QgPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NUTElTVDsKLQkJCXVzZUhvc3RMaXN0ID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVExJU1Q7Ci0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7Ci0JCQl0cnkgewotCQkJCW51bVByb2NzID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTlVNUFJPQ1MsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05VTVBST0NTKTsKLQkJCQlub0xvY2FsID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTk9MT0NBTCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9MT0NBTCk7Ci0JCQkJdXNlUHJlZml4ID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFUFJFRklYLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VQUkVGSVgpOwotCQkJCXByZWZpeCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1BSRUZJWCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfUFJFRklYKTsKLQkJCQlob3N0RmlsZSA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RGSUxFLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NURklMRSk7Ci0JCQkJdXNlSG9zdEZpbGUgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VIT1NURklMRSwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVEZJTEUpOwotCQkJCWhvc3RMaXN0ID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVExJU1QsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RMSVNUKTsKLQkJCQl1c2VIb3N0TGlzdCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RMSVNULCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NUTElTVCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIGhhbmRsZSBleGNlcHRpb24/Ci0JCQkJTVBJQ0gyVUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlpZiAobnVtUHJvY3MgPCAxKSB7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fTm9Qcm9jZXNzKTsKLQkJCX0KLQkJCWlmICh1c2VQcmVmaXggJiYgcHJlZml4ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVByZWZpeCk7Ci0JCQl9Ci0JCQlpZiAodXNlSG9zdEZpbGUgJiYgaG9zdEZpbGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdGZpbGUpOwotCQkJfQotCQkJaWYgKHVzZUhvc3RMaXN0ICYmIGhvc3RMaXN0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RMaXN0KTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDb252ZXJ0IGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgaW50byBvbmUgaG9zdCBwZXIgbGluZQotCQkgKgotCQkgKiBAcGFyYW0gbGlzdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBob3N0TGlzdFRvVGV4dChTdHJpbmcgbGlzdCkgewotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBsaXN0LnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCF2YWx1ZXNbaV0uZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJcmVzdWx0ICs9ICJcciI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXN1bHQgKz0gdmFsdWVzW2ldOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgY3JlYXRlRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIG5ldyBEYXRhU291cmNlKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJY29udHJvbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCAgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9OdW1iZXJQcm9jZXNzZXMpOwotCi0JCW51bVByb2NzU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbnRyb2wsIFNXVC5CT1JERVIpOwotCQludW1Qcm9jc1NwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCW51bVByb2NzU3Bpbm5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0KLQkJZmluYWwgR3JvdXAgb3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMywgMSkpOwotCQlvcHRpb25zR3JvdXAuc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfT3B0aW9uc0dyb3VwKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJbm9Mb2NhbEJ1dHRvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlub0xvY2FsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQlub0xvY2FsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX05vTG9jYWwpOwotCi0JCXVzZVByZWZpeEJ1dHRvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl1c2VQcmVmaXhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCXVzZVByZWZpeEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9QcmVmaXgpOwotCi0JCXByZWZpeFRleHQgPSBuZXcgVGV4dChvcHRpb25zR3JvdXAsIFNXVC5CT1JERVIpOwotCQlwcmVmaXhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQlwcmVmaXhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCi0JCWZpbmFsIEdyb3VwIGhvc3RHcm91cCA9IG5ldyBHcm91cChjb250cm9sLCBTV1QuTk9ORSk7Ci0JCWhvc3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQkJaG9zdEdyb3VwLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RHcm91cCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaG9zdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCWhvc3RGaWxlQnV0dG9uID0gbmV3IEJ1dHRvbihob3N0R3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhvc3RGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQlob3N0RmlsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ib3N0RmlsZSk7Ci0KLQkJaG9zdEZpbGVUZXh0ID0gbmV3IFRleHQoaG9zdEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJaG9zdEZpbGVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlob3N0RmlsZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihob3N0R3JvdXAsIFNXVC5OT05FKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJUGl4ZWxDb252ZXJ0ZXIgcGl4ZWxjb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoY29udHJvbCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJZ2Qud2lkdGhIaW50ID0gcGl4ZWxjb252ZXJ0ZXIuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ccm93c2UpOwotCi0JCWhvc3RMaXN0QnV0dG9uID0gbmV3IEJ1dHRvbihob3N0R3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhvc3RMaXN0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuVE9QLCBmYWxzZSwgZmFsc2UpKTsKLQkJaG9zdExpc3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCWhvc3RMaXN0QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RMaXN0KTsKLQotCQlob3N0TGlzdFRleHQgPSBuZXcgVGV4dChob3N0R3JvdXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlnZC5oZWlnaHRIaW50ID0gMjA7Ci0JCWhvc3RMaXN0VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaG9zdExpc3RUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCX0KLQotCXB1YmxpYyBJQXR0cmlidXRlPD8sID8sID8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxJQXR0cmlidXRlPD8sPyw/Pj4gYXR0cnMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGU8Pyw/LD8+PigpOwotCi0JCWludCBudW1Qcm9jcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OVU1QUk9DUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTlVNUFJPQ1MpOwotCQl0cnkgewotCQkJYXR0cnMuYWRkKEpvYkF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZQcm9jZXNzZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG51bVByb2NzKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1QSUNIMlVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0V4Y2VwdGlvbl9JbnZhbGlkQ29uZmlndXJhdGlvbiwgZSkpOwotCQl9Ci0KLQkJYXR0cnMuYWRkKE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXMuZ2V0TGF1bmNoQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLmNhbGN1bGF0ZUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKSkpOwotCi0JCXJldHVybiBhdHRycy50b0FycmF5KG5ldyBJQXR0cmlidXRlPD8sPyw/PlthdHRycy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05VTVBST0NTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUyk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OT0xPQ0FMLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OT0xPQ0FMKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRVBSRUZJWCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFUFJFRklYKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1BSRUZJWCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfUFJFRklYKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RGSUxFLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NURklMRSk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9IT1NURklMRSwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVEZJTEUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVExJU1QsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RMSVNUKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RMSVNULCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NUTElTVCk7Ci0JCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlwcmVmaXhUZXh0LnNldEVuYWJsZWQodXNlUHJlZml4QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoaG9zdEZpbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlob3N0RmlsZVRleHQuc2V0RW5hYmxlZChob3N0RmlsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWhvc3RMaXN0VGV4dC5zZXRFbmFibGVkKGhvc3RMaXN0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjMyNWQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuTVBJQ0gyVUlQbHVnaW47Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0JBU0UgPSBNUElDSDJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmxhdW5jaEF0dHJpYnV0ZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1QUk9DUyA9IEFUVFJfQkFTRSArICIubnVtUHJvY3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OT0xPQ0FMID0gQVRUUl9CQVNFICsgIi5ub0xvY2FsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJFRklYID0gQVRUUl9CQVNFICsgIi5wcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VQUkVGSVggPSBBVFRSX0JBU0UgKyAiLnVzZVByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hPU1RGSUxFID0gQVRUUl9CQVNFICsgIi5ob3N0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRUhPU1RGSUxFID0gQVRUUl9CQVNFICsgIi51c2VIb3N0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hPU1RMSVNUID0gQVRUUl9CQVNFICsgIi5ob3N0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRUhPU1RMSVNUID0gQVRUUl9CQVNFICsgIi51c2VIb3N0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FSR1VNRU5UUyA9IEFUVFJfQkFTRSArICIuYXJndW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUyA9IEFUVFJfQkFTRSArICIudXNlRGVmYXVsdEFyZ3VtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BBUkFNRVRFUlMgPSBBVFRSX0JBU0UgKyAiLnBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUyA9IEFUVFJfQkFTRSArICIudXNlRGVmYXVsdFBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUFyZ3VtZW50cyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpKSB7Ci0JCQlTdHJpbmcgbGF1bmNoQXJncyA9ICItbnAgIiArIEludGVnZXIudG9TdHJpbmcoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9OVU1QUk9DUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTlVNUFJPQ1MpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTk9MT0NBTCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9MT0NBTCkpIHsKLQkJCQlsYXVuY2hBcmdzICs9ICIgLW5vbG9jYWwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9VU0VQUkVGSVgsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRVBSRUZJWCkpIHsKLQkJCQlsYXVuY2hBcmdzICs9ICIgLS1wcmVmaXggIiArIGZpeFN0cmluZyhjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1BSRUZJWCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfUFJFRklYKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1VTRUhPU1RGSUxFLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NURklMRSkpIHsKLQkJCQlsYXVuY2hBcmdzICs9ICIgLWhvc3RmaWxlICIgKyBmaXhTdHJpbmcoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9IT1NURklMRSwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVEZJTEUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfVVNFSE9TVExJU1QsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RMSVNUKSkgewotCQkJCWxhdW5jaEFyZ3MgKz0gIiAtaG9zdCAiICsgZml4U3RyaW5nKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSE9TVExJU1QsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RMSVNUKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKCEgY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMpKSB7Ci0JCQkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1BBUkFNRVRFUlMsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BBUkFNRVRFUlMpOwotCQkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IHBhcmFtIDogcGFyYW1zLmVudHJ5U2V0KCkpIHsKLQkJCQkJbGF1bmNoQXJncyArPSAiIC1tY2EgIiArIHBhcmFtLmdldEtleSgpICsgIiAiICsgZml4U3RyaW5nKHBhcmFtLmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGF1bmNoQXJnczsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsYXVuY2hBcmdzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9BUkdVTUVOVFMsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0FSR1VNRU5UUyk7Ci0JCQlyZXR1cm4gbGF1bmNoQXJnczsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ha2Ugc3RyaW5nIHN1aXRhYmxlIGZvciBwYXNzaW5nIGFzIGFuIGFyZ3VtZW50Ci0JICoKLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZml4U3RyaW5nKFN0cmluZyBzKSB7Ci0JCS8vIFRPRE8gaXMgdGhhdCByaWdodCBhbmQgZXNjYXBlZCBjb3JyZWN0bHk/Ci0JCWlmIChzID09IG51bGwpIHsKLQkJCXJldHVybiAiXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIlwiIiArIHMgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWMxMmJlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5sYXVuY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLk1QSUNIMlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cyB7Ci0JcHVibGljIHN0YXRpYyBpbnQgQVRUUl9OVU1QUk9DUzsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9OT0xPQ0FMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRVBSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRSX0hPU1RGSUxFOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRUhPU1RGSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJfSE9TVExJU1Q7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfVVNFSE9TVExJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUl9BUkdVTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUzsKLQlwdWJsaWMgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IEFUVFJfUEFSQU1FVEVSUyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRzUmVzb3VyY2VQYXRoID0gIi9kYXRhL2xhdW5jaC1kZWZhdWx0cy5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWREZWZhdWx0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUGF0aCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoID0gbmV3IFBhdGgoZGVmYXVsdHNSZXNvdXJjZVBhdGgpOwotCQlCdW5kbGUgYnVuZGxlID0gTVBJQ0gyVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpOwotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSByZWFkKGRlZmF1bHRzUHJvcGVydGllc1BhdGgsIGJ1bmRsZSk7Ci0KLQkJQVRUUl9OVU1QUk9DUyA9IGdldEludGVnZXIoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiTlVNUFJPQ1MiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX05PTE9DQUwgPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIk5PTE9DQUwiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX1BSRUZJWCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJQUkVGSVgiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX1VTRVBSRUZJWCA9IGdldEJvb2xlYW4oYnVuZGxlLCBwcm9wZXJ0aWVzLCAiVVNFUFJFRklYIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9IT1NURklMRSA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJIT1NURklMRSIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfVVNFSE9TVEZJTEUgPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIlVTRUhPU1RGSUxFIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9BUkdVTUVOVFMgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiQVJHVU1FTlRTIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VERUZBVUxUQVJHVU1FTlRTIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUyA9IGdldEJvb2xlYW4oYnVuZGxlLCBwcm9wZXJ0aWVzLCAiVVNFREVGQVVMVFBBUkFNRVRFUlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydCBBVFRSX1BSRUZJWCAhPSBudWxsOwotCQlhc3NlcnQgQVRUUl9IT1NURklMRSAhPSBudWxsOwotCQlhc3NlcnQgQVRUUl9BUkdVTUVOVFMgIT0gbnVsbDsKLQkJLy8gVE9ETzogcmVhZCBBVFRSX1BBUkFNRVRFUlMKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgcmVhZChQYXRoIGRlZmF1bHRzUHJvcGVydGllc1BhdGgsIEJ1bmRsZSBidW5kbGUpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpblN0cmVhbTsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5IHsKLQkJCWluU3RyZWFtID0gRmlsZUxvY2F0b3Iub3BlblN0cmVhbShidW5kbGUsIGRlZmF1bHRzUHJvcGVydGllc1BhdGgsIGZhbHNlKTsKLQkJCXByb3BlcnRpZXMubG9hZChpblN0cmVhbSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IE1QSUNIMlVJUGx1Z2luLmNvcmVFcnJvckV4Y2VwdGlvbihNZXNzYWdlcy5NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlLCBlKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoQnVuZGxlIGJ1bmRsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfTWlzc2luZ1ZhbHVlLCBrZXkpKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludGVnZXIoQnVuZGxlIGJ1bmRsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsIGtleSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0ZhaWxlZFBhcnNlSW50ZWdlciwga2V5KSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oQnVuZGxlIGJ1bmRsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsIGtleSk7Ci0JCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbih2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2JhYjZhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5sYXVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZG9DcmVhdGUoSVJlc291cmNlTWFuYWdlciBybSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IE5ld01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIocm0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVJlc291cmNlTWFuYWdlcj4gZ2V0UmVzb3VyY2VNYW5hZ2VyQ2xhc3MoKSB7Ci0JCXJldHVybiBNUElDSDJSZXNvdXJjZU1hbmFnZXIuY2xhc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9OZXdNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9OZXdNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTRiZGUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTmV3TVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLkV4dGVuZGFibGVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmV3TVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBleHRlbmRzIEV4dGVuZGFibGVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHsKLQotCXB1YmxpYyBOZXdNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJc3VwZXIoKTsKLQkJYWRkRHluYW1pY1RhYihuZXcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKCkpOwotCQlhZGREeW5hbWljVGFiKG5ldyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWM4YTU1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlVJUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Bcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRBcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRNQ0FQYXJhbWV0ZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9MYXVuY2hBcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX01DQVBhcmFtZXRlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1BBcmFtZXRlclRhYmxlX0NvbHVtbl9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9QYXJhbWV0ZXJUYWJsZV9Db2x1bW5fVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5QXJndW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UGFyYW1ldGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9FeGNlcHRpb25fSW52YWxpZENvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQnlTbG90OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ib3N0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTm9Mb2NhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTm9PdmVyc3Vic2NyaWJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9OdW1iZXJQcm9jZXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX1ByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdExpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX09wdGlvbnNHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RmaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdExpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlQcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fTm9Qcm9jZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19FeGNlcHRpb25fRmFpbGVkUmVhZEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0ZhaWxlZFBhcnNlSW50ZWdlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfTWlzc2luZ1ZhbHVlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByZWZlcmVuY2VQYWdlX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTm9WZXJzaW9uU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmVyc2lvbkNvbWJvX1ZlcnNpb24xMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBQcmV2ZW50IGluc3RhbmNlcy4KLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjdmZmEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotTVBJQ0gyVUlQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I9SW50ZXJuYWwgZXJyb3IKLQotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0FyZ3VtZW50cz1Bcmd1bWVudHM6Ci1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfRGVmYXVsdEFyZ3VtZW50cz1Vc2UgZGVmYXVsdCBhcmd1bWVudHMKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9EZWZhdWx0TUNBUGFyYW1ldGVycz1Vc2UgZGVmYXVsdCBwYXJhbWV0ZXJzCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTGF1bmNoQXJndW1lbnRzPUxhdW5jaCBhcmd1bWVudHMKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9NQ0FQYXJhbWV0ZXJzPU1DQSBQYXJhbWV0ZXJzCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfUEFyYW1ldGVyVGFibGVfQ29sdW1uX05hbWU9TmFtZQotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1BhcmFtZXRlclRhYmxlX0NvbHVtbl9WYWx1ZT1WYWx1ZQotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlPUFkdmFuY2VkIE1QSUNIMgotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlBcmd1bWVudHM9QXJndW1lbnRzIGNhbm5vdCBiZSBlbXB0eQotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlQYXJhbWV0ZXI9UGFyYW1ldGVyIHZhbHVlIGNhbm5vdCBiZSBlbXB0eQotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0V4Y2VwdGlvbl9JbnZhbGlkQ29uZmlndXJhdGlvbj1JbnZhbGlkIGNvbmZpZ3VyYXRpb24KLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ccm93c2U9QnJvd3NlCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQnlTbG90PUJ5IHNsb3QKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ib3N0RmlsZT1Ib3N0IGZpbGU6Ci1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTm9Mb2NhbD1ObyBsb2NhbAotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX05vT3ZlcnN1YnNjcmliZT1ObyBvdmVyc3Vic2NyaWJlCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTnVtYmVyUHJvY2Vzc2VzPU51bWJlciBvZiBwcm9jZXNzZXM6Ci1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfUHJlZml4PVByZWZpeDoKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZT1CYXNpYyBNUElDSDIKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9Ib3N0R3JvdXA9SG9zdHMKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9Ib3N0TGlzdD1Ib3N0IGxpc3Q6Ci1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfT3B0aW9uc0dyb3VwPU9wdGlvbnMKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdGZpbGU9TXVzdCBwcm92aWRlIGEgaG9zdCBmaWxlCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RMaXN0PU11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgaG9zdCBuYW1lCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVByZWZpeD1QcmVmaXggY2Fubm90IGJlIGVtcHR5Ci1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9Ob1Byb2Nlc3M9TXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBwcm9jZXNzCi1NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlPUZhaWxlZCB0byByZWFkIHByb3BlcnRpZXMgZmlsZSB3aXRoIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi1NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyPUZhaWxlZCB0byBwYXJzZSBpbnRlZ2VyIGRlZmF1bHQgdmFsdWUgZm9yIHswfQotTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX01pc3NpbmdWYWx1ZT1NaXNzaW5nIGRlZmF1bHQgdmFsdWUgZm9yIHswfQotCi1NUElDSDJQcmVmZXJlbmNlUGFnZV9UaXRsZT1NUElDSDIgcHJlZmVyZW5jZXMKLQotTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb249RW50ZXIgaW5mb3JtYXRpb24gdG8gY29uZmlndXJlIHRoZSBNUElDSDIgdG9vbAotTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfVmVyc2lvbj1NUElDSDIgdmVyc2lvbjoKLU1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX05hbWU9TVBJQ0gyCi1NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZT1NUElDSDIgdG9vbCBjb25maWd1cmF0aW9uCi1NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WYWxpZGF0aW9uX05vVmVyc2lvblNlbGVjdGVkPU5vIE1QSUNIMiB2ZXJzaW9uIHNlbGVjdGVkCi1NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEyPU1QSUNIMgotTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmVyc2lvbkNvbWJvX1ZlcnNpb24xMz1NUElDSDIKLU1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb249RW50ZXIgTVBJQ0gyIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24KLU1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGU9TVBJQ0gyIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViZjlhMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLndpemFyZHMuQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS53aXphcmRzLldpemFyZFBhZ2VEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS53aXphcmRzLldpemFyZFBhZ2VXaWRnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuSVJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgewotCi0JU3RyaW5nIHZlcnNpb25JZHNbXSA9IG5ldyBTdHJpbmdbXSB7IH07Ci0JU3RyaW5nIHZlcnNpb25zTmFtZXNbXSA9IG5ldyBTdHJpbmdbXSB7IE1lc3NhZ2VzLk1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTIsIE1lc3NhZ2VzLk1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTN9OwotCi0JcHJvdGVjdGVkIENvbWJvIHZlcnNpb25Db21ibzsKLQotCXByb3RlY3RlZCBjbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuV2lkZ2V0TGlzdGVuZXIgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9Nb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgewotCQkJc3VwZXIuZG9Nb2RpZnlUZXh0KGV2dCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdmVyc2lvbkNvbWJvKSB7Ci0JCQkJaGFuZGxlVmVyc2lvblNlbGVjdGVkKCk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQlnZXREYXRhU291cmNlKCkuc3RvcmVBbmRWYWxpZGF0ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIERhdGFTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLkRhdGFTb3VyY2UgewotCQlwcm90ZWN0ZWQgRGF0YVNvdXJjZShBYnN0cmFjdENvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHBhZ2UpIHsKLQkJCXN1cGVyKHBhZ2UpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlGcm9tRmllbGRzKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJc3VwZXIuY29weUZyb21GaWVsZHMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9GaWVsZHMoKSB7Ci0JCQlzdXBlci5jb3B5VG9GaWVsZHMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7Ci0JCQlzdXBlci5sb2FkRnJvbVN0b3JhZ2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCkgewotCQkJc3VwZXIuY29weVRvU3RvcmFnZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlzdXBlci52YWxpZGF0ZUxvY2FsKCk7Ci0JCX0KLQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRDb25maWcoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkJdGhpcy5jb25maWcgPSAoSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb247Ci0JCQlzdXBlci5zZXRDb25maWcoY29uZmlndXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV2l6YXJkUGFnZVdpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldExpc3RlbmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdpemFyZFBhZ2VEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBuZXcgRGF0YVNvdXJjZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UoSVJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsKLQkJc3VwZXIod2l6YXJkLCBJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5NUElDSDJfQ0FQQUJJTElUSUVTLCAKLQkJCQlNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9OYW1lLCAKLQkJCQlNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZSwgCi0JCQkJTWVzc2FnZXMuTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9DcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOwotCi0JCWNyZWF0ZUNvbnRlbnRzKGNvbnRlbnRzKTsKLQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVyc2lvbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbnRlbnRzLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8qCi0JCSAqIFNlbGVjdGlvbiBmb3Igb3Blbm1waSB2ZXJzaW9uLgotCQkgKi8KLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLk1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1ZlcnNpb24pOwotCi0JCXZlcnNpb25Db21ibyA9IG5ldyBDb21ibyhjb250ZW50cywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXZlcnNpb25Db21iby5hZGQodmVyc2lvbnNOYW1lc1tpXSk7Ci0JCX0KLQkJdmVyc2lvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFdpZGdldExpc3RlbmVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZVZlcnNpb25TZWxlY3RlZCgpIHsKLQkJZ2V0V2lkZ2V0TGlzdGVuZXIoKS5kaXNhYmxlKCk7Ci0JCURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IChEYXRhU291cmNlKSB0aGlzLmdldERhdGFTb3VyY2UoKTsKLQkJZGF0YVNvdXJjZS5qdXN0VmFsaWRhdGUoKTsKLQkJU3RyaW5nIGxhdW5jaENtZCA9IG51bGw7Ci0JCVN0cmluZyBkZWJ1Z0NtZCA9IG51bGw7Ci0JCVN0cmluZyBkaXNjb3ZlckNtZCA9IG51bGw7Ci0JCVN0cmluZyByZW1vdGVJbnN0YWxsUGF0aCA9IG51bGw7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJbGF1bmNoQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0xBVU5DSF9DTUQpOwotCQlkZWJ1Z0NtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQpOwotCQlkaXNjb3ZlckNtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQpOwotCQlyZW1vdGVJbnN0YWxsUGF0aCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19SRU1PVEVfSU5TVEFMTF9QQVRIKTsKLQkJcmVzZXRFcnJvck1lc3NhZ2VzKCk7Ci0JCWRhdGFTb3VyY2Uuc2V0Q29tbWFuZEZpZWxkcyhsYXVuY2hDbWQsIGRlYnVnQ21kLCBkaXNjb3ZlckNtZCwgbnVsbCwgMCwgbnVsbCwgZGF0YVNvdXJjZS5nZXRSZW1vdGVJbnN0YWxsUGF0aCgpKTsKLQkJZGF0YVNvdXJjZS5zZXRVc2VEZWZhdWx0cyh0cnVlKTsKLQkJZGF0YVNvdXJjZS5jb3B5VG9GaWVsZHMoKTsKLQkJZ2V0V2lkZ2V0TGlzdGVuZXIoKS5lbmFibGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmODdhMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLndpemFyZHMuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5JUk1Db25maWd1cmF0aW9uV2l6YXJkOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKElSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7Ci0JCXN1cGVyKHdpemFyZCwgTWVzc2FnZXMuTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLk1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0Rlc2NyaXB0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvLmNsYXNzcGF0aCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNzI2NDcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDAxZGFhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEF1ZyAzMSAyMDo1MTozMiBDRFQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTBjZGFlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUuQWN0aXZhdG9yDQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2Uuc2VhcmNoLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwNCi0gb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sLA0KLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjEuMCINCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUsDQotIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS5ybXN5c3RlbQ0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvYWJvdXQuaHRtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNmYzYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPHRpdGxlPkFib3V0PC90aXRsZT4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkVOLVVTIj4NCi08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4NCi0gDQotPHA+QXByaSAxNCwgMjAwOTwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjAzNzUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZjkxZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBQQlMgQ29yZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvcGx1Z2luLnhtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5NDMwMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/Pg0KLTxwbHVnaW4+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL0FjdGl2YXRvci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTliY2ViLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlDQotICovDQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUiOyAvLyROT04tTkxTLTEkDQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsNCi0JDQotCS8qKg0KLQkgKiBUaGUgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBY3RpdmF0b3IoKSB7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcGx1Z2luID0gbnVsbDsNCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9QQlNBdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvUEJTQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk1ODYzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9QQlNBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmU7DQotDQotcHVibGljIGNsYXNzIFBCU0F0dHJpYnV0ZXMgew0KLQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvUEJTSm9iQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL1BCU0pvYkF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4YmRhZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvUEJTSm9iQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci0KLQotLyoqCi0gKiBKb2IgYXR0cmlidXRlcwotICovCi1wdWJsaWMgY2xhc3MgUEJTSm9iQXR0cmlidXRlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRV9BVFRSX0lEID0gIkFjY291bnRfTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tQT0lOVF9BVFRSX0lEID0gIkNoZWNrcG9pbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfQVRUUl9JRCA9ICJjb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVBFTkRfQVRUUl9JRCA9ICJkZXBlbmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1BBVEhfQVRUUl9JRCA9ICJFcnJvcl9QYXRoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVDVVRJT05fVElNRV9BVFRSX0lEID0gIkV4ZWN1dGlvbl9UaW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9MSVNUX0FUVFJfSUQgPSAiZ3JvdXBfbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MRF9UWVBFU19BVFRSX0lEID0gIkhvbGRfVHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9OQU1FX0FUVFJfSUQgPSAiSm9iX05hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fUEFUSF9BVFRSX0lEID0gIkpvaW5fUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VFUF9GSUxFU19BVFRSX0lEID0gIktlZXBfRmlsZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSUxfUE9JTlRTX0FUVFJfSUQgPSAiTWFpbF9Qb2ludHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSUxfVVNFUlNfQVRUUl9JRCA9ICJNYWlsX1VzZXJzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19TVERJT19TT0NLRVRTX0FUVFJfSUQgPSAibm9fc3RkaW9fc29ja2V0cyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX1BBVEhfQVRUUl9JRCA9ICJPdXRwdXRfUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfQVRUUl9JRCA9ICJQcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVSVU5OQUJMRV9BVFRSX0lEID0gIlJlcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19BUkNIX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC5hcmNoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfQ1BVVF9BVFRSX0lEID0gIlJlc291cmNlX0xpc3QuY3B1dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0ZJTEVfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0LmZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19IT1NUX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC5ob3N0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfTUVNX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC5tZW0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19NUElQUk9DU19BVFRSX0lEID0gIlJlc291cmNlX0xpc3QubXBpcHJvY3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19OQ1BVU19BVFRSX0lEID0gIlJlc291cmNlX0xpc3QubmNwdXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19OSUNFX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC5uaWNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfTk9ERVNfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0Lm5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfTk9ERUNUX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC5ub2RlY3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19PTVBUSFJFQURTX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC5vbXB0aHJlYWRzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfUENQVVRfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0LnBjcHV0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfUE1FTV9BVFRSX0lEID0gIlJlc291cmNlX0xpc3QucG1lbSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX1BWTUVNX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC5wdm1lbSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX1JFU0NfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0LnJlc2MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19WTUVNX0FUVFJfSUQgPSAiUmVzb3VyY2VfTGlzdC52bWVtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfV0FMTFRJTUVfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0LndhbGx0aW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfTVBQRV9BVFRSX0lEID0gIlJlc291cmNlX0xpc3QubXBwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX01QUFRfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0Lm1wcHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19QRl9BVFRSX0lEID0gIlJlc291cmNlX0xpc3QucGYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19QTVBQVF9BVFRSX0lEID0gIlJlc291cmNlX0xpc3QucG1wcHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19QTkNQVVNfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0LnBuY3B1cyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX1BQRl9BVFRSX0lEID0gIlJlc291cmNlX0xpc3QucHBmIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfUFJPQ1NfQVRUUl9JRCA9ICJSZXNvdXJjZV9MaXN0LnByb2NzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfUFNEU19BVFRSX0lEID0gIlJlc291cmNlX0xpc3QucHNkcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX1NEU19BVFRSX0lEID0gIlJlc291cmNlX0xpc3Quc2RzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSEVMTF9QQVRIX0xJU1RfQVRUUl9JRCA9ICJTaGVsbF9QYXRoX0xpc3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUdFSU5fQVRUUl9JRCA9ICJzdGFnZWluIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFHRU9VVF9BVFRSX0lEID0gInN0YWdlb3V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFTS19BVFRSX0lEID0gInVtYXNrIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0xJU1RfQVRUUl9JRCA9ICJVc2VyX0xpc3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQkxFX0xJU1RfQVRUUl9JRCA9ICJWYXJpYWJsZV9MaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gYXR0ckRlZnMgPSBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXsKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihBQ0NPVU5UX05BTUVfQVRUUl9JRCwgQUNDT1VOVF9OQU1FX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oQ0hFQ0tQT0lOVF9BVFRSX0lELCBDSEVDS1BPSU5UX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oQ09NTUVOVF9BVFRSX0lELCBDT01NRU5UX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oREVQRU5EX0FUVFJfSUQsIERFUEVORF9BVFRSX0lELCAiIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEVSUk9SX1BBVEhfQVRUUl9JRCwgRVJST1JfUEFUSF9BVFRSX0lELCAiIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEVYRUNVVElPTl9USU1FX0FUVFJfSUQsIEVYRUNVVElPTl9USU1FX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oR1JPVVBfTElTVF9BVFRSX0lELCBHUk9VUF9MSVNUX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oSE9MRF9UWVBFU19BVFRSX0lELCBIT0xEX1RZUEVTX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oSk9CX05BTUVfQVRUUl9JRCwgSk9CX05BTUVfQVRUUl9JRCwgIiIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihKT0lOX1BBVEhfQVRUUl9JRCwgSk9JTl9QQVRIX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oS0VFUF9GSUxFU19BVFRSX0lELCBLRUVQX0ZJTEVTX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oTUFJTF9QT0lOVFNfQVRUUl9JRCwgTUFJTF9QT0lOVFNfQVRUUl9JRCwgIiIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihNQUlMX1VTRVJTX0FUVFJfSUQsIE1BSUxfVVNFUlNfQVRUUl9JRCwgIiIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihOT19TVERJT19TT0NLRVRTX0FUVFJfSUQsIE5PX1NURElPX1NPQ0tFVFNfQVRUUl9JRCwgIiIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihPVVRQVVRfUEFUSF9BVFRSX0lELCBPVVRQVVRfUEFUSF9BVFRSX0lELCAiIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihQUklPUklUWV9BVFRSX0lELCBQUklPUklUWV9BVFRSX0lELCAiIiwgdHJ1ZSwgMCksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVSVU5OQUJMRV9BVFRSX0lELCBSRVJVTk5BQkxFX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX0FSQ0hfQVRUUl9JRCwgUkVTX0FSQ0hfQVRUUl9JRCwgIlN5c3RlbSBhcmNoaXRlY3R1cmUiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX0NQVVRfQVRUUl9JRCwgUkVTX0NQVVRfQVRUUl9JRCwgIk1heGltdW0sIGFnZ3JlZ2F0ZSBDUFUgdGltZSByZXF1aXJlZCBieSBhbGwgcHJvY2Vzc2VzIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFJFU19GSUxFX0FUVFJfSUQsIFJFU19GSUxFX0FUVFJfSUQsICJNYXhpbXVtIGRpc2sgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBhbnkgc2luZ2xlIGZpbGUgdG8gYmUgY3JlYXRlZCIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfSE9TVF9BVFRSX0lELCBSRVNfSE9TVF9BVFRSX0lELCAiTmFtZSBvZiByZXF1ZXN0ZWQgaG9zdC9ub2RlIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFJFU19NRU1fQVRUUl9JRCwgUkVTX01FTV9BVFRSX0lELCAiTWF4aW11bSBhbW91bnQgb2YgcGh5c2ljYWwgbWVtb3J5IChSQU0pIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfTVBJUFJPQ1NfQVRUUl9JRCwgUkVTX01QSVBST0NTX0FUVFJfSUQsICJOdW1iZXIgb2YgTVBJIHByb2Nlc3NlcyBmb3IgdGhpcyBjaHVuayIsIHRydWUsIDApLAotCQkJCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfTkNQVVNfQVRUUl9JRCwgUkVTX05DUFVTX0FUVFJfSUQsICJOdW1iZXIgb2YgQ1BVcyAocHJvY2Vzc29ycykiLCB0cnVlLCAwKSwKLQkJCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oUkVTX05JQ0VfQVRUUl9JRCwgUkVTX05JQ0VfQVRUUl9JRCwgIlJlcXVlc3RlZCBqb2IgcHJpb3JpdHkiLCB0cnVlLCAwKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfTk9ERVNfQVRUUl9JRCwgUkVTX05PREVTX0FUVFJfSUQsICJOdW1iZXIgYW5kL29yIHR5cGUgb2Ygbm9kZXMiLCB0cnVlLCAiIiksCi0JCQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKFJFU19OT0RFQ1RfQVRUUl9JRCwgUkVTX05PREVDVF9BVFRSX0lELCAiTnVtYmVyIG9mIGNodW5rcyBpbiByZXNvdXJjZSByZXF1ZXN0IGZyb20gc2VsZWN0aW9uIGRpcmVjdGl2ZSwgb3IgbnVtYmVyIG9mIHZub2RlcyByZXF1ZXN0ZWQgZnJvbSBub2RlIHNwZWNpZmljYXRpb24iLCB0cnVlLCAwKSwKLQkJCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oUkVTX09NUFRIUkVBRFNfQVRUUl9JRCwgUkVTX09NUFRIUkVBRFNfQVRUUl9JRCwgIk51bWJlciBvZiBPcGVuTVAgdGhyZWFkcyBmb3IgdGhpcyBjaHVuayIsIHRydWUsIDApLAotCQkJCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFJFU19QQ1BVVF9BVFRSX0lELCBSRVNfUENQVVRfQVRUUl9JRCwgIlBlci1wcm9jZXNzIG1heGltdW0gQ1BVIHRpbWUiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX1BNRU1fQVRUUl9JRCwgUkVTX1BNRU1fQVRUUl9JRCwgIlBlci1wcm9jZXNzIG1heGltdW0gYW1vdW50IG9mIHBoeXNpY2FsIG1lbW9yeSIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfUFZNRU1fQVRUUl9JRCwgUkVTX1BWTUVNX0FUVFJfSUQsICJQZXItcHJvY2VzcyBtYXhpbXVtIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfUkVTQ19BVFRSX0lELCBSRVNfUkVTQ19BVFRSX0lELCAiU2luZ2xlLW5vZGUgdmFyaWFibGUgcmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiBzdHJpbmciLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX1ZNRU1fQVRUUl9JRCwgUkVTX1ZNRU1fQVRUUl9JRCwgIk1heGltdW0sIGFnZ3JlZ2F0ZSBhbW91bnQgb2YgdmlydHVhbCBtZW1vcnkgdXNlZCBieSBhbGwgY29uY3VycmVudCBwcm9jZXNzZXMiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX1dBTExUSU1FX0FUVFJfSUQsIFJFU19XQUxMVElNRV9BVFRSX0lELCAiTWF4aW11bSBhbW91bnQgb2YgcmVhbCB0aW1lICh3YWxsLWNsb2NrIGVsYXBzZWQgdGltZSkiLCB0cnVlLCAiIiksCi0JCQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKFJFU19NUFBFX0FUVFJfSUQsIFJFU19NUFBFX0FUVFJfSUQsICJOdW1iZXIgb2YgcHJvY2Vzc2luZyBlbGVtZW50cyB1c2VkIGJ5IGEgc2luZ2xlIHByb2Nlc3MiLCB0cnVlLCAwKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfTVBQVF9BVFRSX0lELCBSRVNfTVBQVF9BVFRSX0lELCAiTWF4aW11bSB3YWxsY2xvY2sgdGltZSB1c2VkIG9uIHRoZSBNUFAiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX1BGX0FUVFJfSUQsIFJFU19QRl9BVFRSX0lELCAiTWF4aW11bSBudW1iZXIgb2YgZmlsZSBzeXN0ZW0gYmxvY2tzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYWxsIHByb2Nlc3MiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX1BNUFBUX0FUVFJfSUQsIFJFU19QTVBQVF9BVFRSX0lELCAiTWF4aW11bSBhbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIHVzZWQgb24gdGhlIE1QUCBieSBhIHNpbmdsZSBwcm9jZXNzIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfUE5DUFVTX0FUVFJfSUQsIFJFU19QTkNQVVNfQVRUUl9JRCwgIk1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NvcnMgdXNlZCBieSBhbnkgc2luZ2xlIHByb2Nlc3MiLCB0cnVlLCAwKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihSRVNfUFBGX0FUVFJfSUQsIFJFU19QUEZfQVRUUl9JRCwgIk1heGltdW0gbnVtYmVyIG9mIGZpbGUgc3lzdGVtIGJsb2NrcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgc2luZ2xlIHByb2Nlc3MiLCB0cnVlLCAiIiksCi0JCQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKFJFU19QUk9DU19BVFRSX0lELCBSRVNfUFJPQ1NfQVRUUl9JRCwgIk1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NlcyIsIHRydWUsIDApLAotCQkJCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFJFU19QU0RTX0FUVFJfSUQsIFJFU19QU0RTX0FUVFJfSUQsICJNYXhpbXVtIG51bWJlciBvZiBkYXRhIGJsb2NrcyBvbiB0aGUgU0RTIChzZWNvbmRhcnkgZGF0YSBzdG9yYWdlKSBmb3IgYW55IHByb2Nlc3MiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oUkVTX1NEU19BVFRSX0lELCBSRVNfU0RTX0FUVFJfSUQsICJNYXhpbXVtIG51bWJlciBvZiBkYXRhIGJsb2NrcyBvbiB0aGUgU0RTIChzZWNvbmRhcnkgZGF0YSBzdG9yYWdlKSIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihTSEVMTF9QQVRIX0xJU1RfQVRUUl9JRCwgU0hFTExfUEFUSF9MSVNUX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oU1RBR0VJTl9BVFRSX0lELCBTVEFHRUlOX0FUVFJfSUQsICIiLCB0cnVlLCAiIiksCi0JCQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oU1RBR0VPVVRfQVRUUl9JRCwgU1RBR0VPVVRfQVRUUl9JRCwgIiIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihVTUFTS19BVFRSX0lELCBVTUFTS19BVFRSX0lELCAiIiwgdHJ1ZSwgIiIpLAotCQkJCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFVTRVJfTElTVF9BVFRSX0lELCBVU0VSX0xJU1RfQVRUUl9JRCwgIiIsIHRydWUsICIiKSwKLQkJCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihWQVJJQUJMRV9MSVNUX0FUVFJfSUQsIFZBUklBQkxFX0xJU1RfQVRUUl9JRCwgIiIsIHRydWUsICIiKSwKLQkJCX07Ci0JCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBhdHRyRGVmczsKLQl9Ci19Ci0KLS8qCi0gUmVzb3VyY2VfTGlzdC5hcmNoCQkJc3RyaW5nCQlTeXN0ZW0gYXJjaGl0ZWN0dXJlCi0gUmVzb3VyY2VfTGlzdC5jcHV0CQkJdGltZQkJTWF4aW11bSwgYWdncmVnYXRlIENQVSB0aW1lIHJlcXVpcmVkIGJ5IGFsbCBwcm9jZXNzZXMKLSBSZXNvdXJjZV9MaXN0LmZpbGUJCQlzaXplCQlNYXhpbXVtIGRpc2sgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBhbnkgc2luZ2xlIGZpbGUgdG8gYmUgY3JlYXRlZAotIFJlc291cmNlX0xpc3QuaG9zdAkJCXN0cmluZwkJTmFtZSBvZiByZXF1ZXN0ZWQgaG9zdC9ub2RlCi0gUmVzb3VyY2VfTGlzdC5tZW0JCQlzaXplCQlNYXhpbXVtIGFtb3VudCBvZiBwaHlzaWNhbCBtZW1vcnkgKFJBTSkKLSBSZXNvdXJjZV9MaXN0Lm1waXByb2NzCQlpbnQJCQlOdW1iZXIgb2YgTVBJIHByb2Nlc3NlcyBmb3IgdGhpcyBjaHVuawotIFJlc291cmNlX0xpc3QubmNwdXMJCWludAkJCU51bWJlciBvZiBDUFVzIChwcm9jZXNzb3JzKQotIFJlc291cmNlX0xpc3QubmljZQkJCWludAkJCVJlcXVlc3RlZCBqb2IgcHJpb3JpdHkKLSBSZXNvdXJjZV9MaXN0Lm5vZGVzCQlzdHJpbmcJCU51bWJlciBhbmQvb3IgdHlwZSBvZiBub2RlcwotIFJlc291cmNlX0xpc3Qubm9kZWN0CQlpbnQJCQlOdW1iZXIgb2YgY2h1bmtzIGluIHJlc291cmNlIHJlcXVlc3QgZnJvbSBzZWxlY3Rpb24gZGlyZWN0aXZlLCBvciBudW1iZXIgb2Ygdm5vZGVzIHJlcXVlc3RlZCBmcm9tIG5vZGUgc3BlY2lmaWNhdGlvbgotIFJlc291cmNlX0xpc3Qub21wdGhyZWFkcwlpbnQJCQlOdW1iZXIgb2YgT3Blbk1QIHRocmVhZHMgZm9yIHRoaXMgY2h1bmsuCi0gUmVzb3VyY2VfTGlzdC5wY3B1dAkJdGltZQkJUGVyLXByb2Nlc3MgbWF4aW11bSBDUFUgdGltZQotIFJlc291cmNlX0xpc3QucG1lbQkJCXNpemUJCVBlci1wcm9jZXNzIG1heGltdW0gYW1vdW50IG9mIHBoeXNpY2FsIG1lbW9yeQotIFJlc291cmNlX0xpc3QucHZtZW0JCXNpemUJCVBlci1wcm9jZXNzIG1heGltdW0gYW1vdW50IG9mIHZpcnR1YWwgbWVtb3J5Ci0gUmVzb3VyY2VfTGlzdC5yZXNjCQkJc3RyaW5nCQlTaW5nbGUtbm9kZSB2YXJpYWJsZSByZXNvdXJjZSBzcGVjaWZpY2F0aW9uIHN0cmluZwotIFJlc291cmNlX0xpc3Qudm1lbQkJCXNpemUJCU1heGltdW0sIGFnZ3JlZ2F0ZSBhbW91bnQgb2YgdmlydHVhbCBtZW1vcnkgdXNlZCBieSBhbGwgY29uY3VycmVudCBwcm9jZXNzZXMKLSBSZXNvdXJjZV9MaXN0LndhbGx0aW1lCQl0aW1lCQlNYXhpbXVtIGFtb3VudCBvZiByZWFsIHRpbWUgKHdhbGwtY2xvY2sgZWxhcHNlZCB0aW1lKQotIFJlc291cmNlX0xpc3QubXBwZQkJCWludAkJCVRoZSBudW1iZXIgb2YgcHJvY2Vzc2luZyBlbGVtZW50cyB1c2VkIGJ5IGEgc2luZ2xlIHByb2Nlc3MKLSBSZXNvdXJjZV9MaXN0Lm1wcHQJCQl0aW1lCQlNYXhpbXVtIHdhbGxjbG9jayB0aW1lIHVzZWQgb24gdGhlIE1QUC4KLSBSZXNvdXJjZV9MaXN0LnBmCQkJc2l6ZQkJTWF4aW11bSBudW1iZXIgb2YgZmlsZSBzeXN0ZW0gYmxvY2tzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYWxsIHByb2Nlc3MKLSBSZXNvdXJjZV9MaXN0LnBtcHB0CQl0aW1lCQlNYXhpbXVtIGFtb3VudCBvZiB3YWxsIGNsb2NrIHRpbWUgdXNlZCBvbiB0aGUgTVBQIGJ5IGEgc2luZ2xlIHByb2Nlc3MKLSBSZXNvdXJjZV9MaXN0LnBuY3B1cwkJaW50CQkJTWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29ycyB1c2VkIGJ5IGFueSBzaW5nbGUgcHJvY2VzcwotIFJlc291cmNlX0xpc3QucHBmCQkJc2l6ZQkJTWF4aW11bSBudW1iZXIgb2YgZmlsZSBzeXN0ZW0gYmxvY2tzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBzaW5nbGUgcHJvY2VzcwotIFJlc291cmNlX0xpc3QucHJvY3MJCWludAkJCU1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NlcwotIFJlc291cmNlX0xpc3QucHNkcwkJCXNpemUJCU1heGltdW0gbnVtYmVyIG9mIGRhdGEgYmxvY2tzIG9uIHRoZSBTRFMgKHNlY29uZGFyeSBkYXRhIHN0b3JhZ2UpIGZvciBhbnkgcHJvY2VzcwotIFJlc291cmNlX0xpc3Quc2RzCQkJc2l6ZQkJTWF4aW11bSBudW1iZXIgb2YgZGF0YSBibG9ja3Mgb24gdGhlIFNEUyAoc2Vjb25kYXJ5IGRhdGEgc3RvcmFnZSkKLSovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL1BCU1ByZWZlcmVuY2VNYW5hZ2VyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvUEJTUHJlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2MTg0My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvUEJTUHJlZmVyZW5jZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb3h5T3B0aW9uczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS51aS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOw0KLQ0KLXB1YmxpYyBjbGFzcyBQQlNQcmVmZXJlbmNlTWFuYWdlciB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9FWEVDVVRBQkxFX1BBVEggPSBudWxsOyAvLyB1c2UgbG9jYWwgZnJhZ21lbnQgZGlyZWN0b3J5DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUFRJT05TID0gSVJlbW90ZVByb3h5T3B0aW9ucy5QT1JUX0ZPUldBUkRJTkc7DQotCQ0KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0T3B0aW9ucygpIHsNCi0JCXJldHVybiBPUFRJT05TOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQcm94eUV4ZWN1dGFibGVQYXRoKCkgew0KLQkJcmV0dXJuIFBST1hZX0VYRUNVVEFCTEVfUEFUSDsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgew0KLQkJcmV0dXJuIEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsNCi0JCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJlZmVyZW5jZXMoKSB7DQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsNCi0JCQ0KLQkJU3RyaW5nIHNlcnZlciA9ICIiOw0KLQkJCQ0KLQkJaWYgKFBST1hZX0VYRUNVVEFCTEVfUEFUSCAhPSBudWxsKSB7DQotCQkJLy9zZXJ2ZXIgPSBuZXcgUGF0aChQUk9YWV9FWEVDVVRBQkxFX1BBVEgpLmFwcGVuZChQUk9YWV9FWEVDVVRBQkxFX05BTUUpLnRvT1NTdHJpbmcoKTsNCi0JCX0gZWxzZSB7DQotCQkJLy9zZXJ2ZXIgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5sb2NhdGVGcmFnbWVudEZpbGUoIm9yZy5lY2xpcHNlLnB0cCIsIFBST1hZX0VYRUNVVEFCTEVfTkFNRSk7DQotCQkJaWYgKHNlcnZlciA9PSBudWxsKSB7DQotCQkJCXNlcnZlciA9ICIiOw0KLQkJCX0NCi0gICAgICAgfQ0KLQkJDQotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfUEFUSCwgc2VydmVyKTsNCi0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05TLCBPUFRJT05TKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvbWVzc2FnZXMvTWVzc2FnZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVhMDllLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLm1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KLQ0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUubWVzc2FnZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU0pvYkF0dHJpYnV0ZXNfMDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTSm9iQXR0cmlidXRlc18xOw0KLQkNCi0Jc3RhdGljIHsNCi0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlDQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7DQotCX0NCi0NCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsNCi0JCS8vIFByZXZlbnQgaW5zdGFuY2VzLg0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2IyYzEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVBCU0pvYkF0dHJpYnV0ZXNfMD1OdW1iZXIgb2YgTm9kZXMNCi1QQlNKb2JBdHRyaWJ1dGVzXzE9Sm9iIFRpbWUgTGltaXQNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvcm1zeXN0ZW0vSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9ybXN5c3RlbS9JUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQ3ZDRkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9ybXN5c3RlbS9JUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS5jb3JlLklSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgSVJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gewotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcGJzZEFyZ3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBCU2RBcmdzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBwYnNkUGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UEJTZFBhdGgoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB1c2VEZWZhdWx0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFVzZURlZmF1bHRzKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGJzZEFyZ3VtZW50cwotCSAqICAgICAgICAgICAgdGhlIHBic2RBcmdzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBCU2RBcmdzKFN0cmluZyBwYnNkQXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBic2RQYXRoCi0JICogICAgICAgICAgICB0aGUgcGJzZFBhdGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UEJTZFBhdGgoU3RyaW5nIHBic2RQYXRoKTsKLQotCS8qKgotCSAqIEBwYXJhbSB1c2VEZWZhdWx0cwotCSAqICAgICAgICAgICAgdGhlIHVzZURlZmF1bHRzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRzKGJvb2xlYW4gdXNlRGVmYXVsdHMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9ybXN5c3RlbS9QQlNSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9ybXN5c3RlbS9QQlNSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhZWJjNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvcm1zeXN0ZW0vUEJTUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJtc3lzdGVtOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTm9kZUNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJ0c3lzdGVtLlBCU1Byb3h5UnVudGltZUNsaWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJ0c3lzdGVtLlBCU1J1bnRpbWVTeXN0ZW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklSdW50aW1lU3lzdGVtOw0KLQ0KLXB1YmxpYyBjbGFzcyBQQlNSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIgew0KLQ0KLQlwcml2YXRlIEludGVnZXIgUEJTUk1JRDsNCi0JDQotCXB1YmxpYyBQQlNSZXNvdXJjZU1hbmFnZXIoSW50ZWdlciBpZCwgSVBVbml2ZXJzZUNvbnRyb2wgdW5pdmVyc2UsIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZykgew0KLQkJc3VwZXIoaWQudG9TdHJpbmcoKSwgdW5pdmVyc2UsIGNvbmZpZyk7DQotCQlQQlNSTUlEID0gaWQ7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQWZ0ZXJDbG9zZUNvbm5lY3Rpb24oKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpIHsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UHJveHlSZXNvdXJjZU1hbmFnZXIjZG9BZnRlck9wZW5Db25uZWN0aW9uKCkNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRvQWZ0ZXJPcGVuQ29ubmVjdGlvbigpIHsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UHJveHlSZXNvdXJjZU1hbmFnZXIjZG9CZWZvcmVDbG9zZUNvbm5lY3Rpb24oKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVDbG9zZUNvbm5lY3Rpb24oKSB7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQmVmb3JlT3BlbkNvbm5lY3Rpb24oKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpIHsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZUpvYihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2wsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBKb2JDb250cm9sIGRvQ3JlYXRlSm9iKElQUXVldWVDb250cm9sIHF1ZXVlLCBTdHJpbmcgam9iSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiBuZXdKb2IocXVldWUsIGpvYklkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVNYWNoaW5lKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBNYWNoaW5lQ29udHJvbCBkb0NyZWF0ZU1hY2hpbmUoU3RyaW5nIG1hY2hpbmVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld01hY2hpbmUobWFjaGluZUlkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVOb2RlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElQTm9kZUNvbnRyb2wgZG9DcmVhdGVOb2RlKElQTWFjaGluZUNvbnRyb2wgbWFjaGluZSwgU3RyaW5nIG5vZGVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld05vZGUobWFjaGluZSwgbm9kZUlkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVQcm9jZXNzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2wsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBQcm9jZXNzQ29udHJvbCBkb0NyZWF0ZVByb2Nlc3MoSVBKb2JDb250cm9sIGpvYiwgU3RyaW5nIHByb2Nlc3NJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld1Byb2Nlc3Moam9iLCBwcm9jZXNzSWQsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVF1ZXVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBRdWV1ZUNvbnRyb2wgZG9DcmVhdGVRdWV1ZShTdHJpbmcgcXVldWVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld1F1ZXVlKHF1ZXVlSWQsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJUnVudGltZVN5c3RlbSBkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKSB7DQotCQlJUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSAoSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIGdldENvbmZpZ3VyYXRpb24oKTsNCi0JCS8qIGxvYWQgdXAgdGhlIGNvbnRyb2wgYW5kIG1vbml0b3Jpbmcgc3lzdGVtcyBmb3IgUEJTICovDQotCQlQQlNQcm94eVJ1bnRpbWVDbGllbnQgcnVudGltZVByb3h5ID0gbmV3IFBCU1Byb3h5UnVudGltZUNsaWVudChjb25maWcsIFBCU1JNSUQpOw0KLQkJcmV0dXJuIG5ldyBQQlNSdW50aW1lU3lzdGVtKHJ1bnRpbWVQcm94eSwgZ2V0QXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIoKSk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVKb2JzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVKb2JzKElQUXVldWVDb250cm9sIHF1ZXVlLCBDb2xsZWN0aW9uPElQSm9iQ29udHJvbD4gam9icywNCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlSm9icyhxdWV1ZSwgam9icywgYXR0cnMpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlTWFjaGluZXMoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZU1hY2hpbmVzKENvbGxlY3Rpb248SVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZXMsDQotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIHVwZGF0ZU1hY2hpbmVzKG1hY2hpbmVzLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVOb2RlcyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbCwgamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZU5vZGVzKElQTWFjaGluZUNvbnRyb2wgbWFjaGluZSwgDQotCQkJQ29sbGVjdGlvbjxJUE5vZGVDb250cm9sPiBub2RlcywgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIHVwZGF0ZU5vZGVzKG1hY2hpbmUsIG5vZGVzLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVQcm9jZXNzZXMob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbCwgamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZVByb2Nlc3NlcyhJUEpvYkNvbnRyb2wgam9iLA0KLQkJCUNvbGxlY3Rpb248SVBQcm9jZXNzQ29udHJvbD4gcHJvY2Vzc2VzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlUHJvY2Vzc2VzKGpvYiwgcHJvY2Vzc2VzLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVRdWV1ZXMoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZVF1ZXVlcyhDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBxdWV1ZXMsDQotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIHVwZGF0ZVF1ZXVlcyhxdWV1ZXMsIGF0dHJzKTsNCi0JfQ0KLSAJDQotIAkvKiAobm9uLUphdmFkb2MpDQotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVSTShvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotIAkgKi8NCi0gCUBPdmVycmlkZQ0KLSAJcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVSTShBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotIAkJcmV0dXJuIHVwZGF0ZVJNKGF0dHJzKTsNCi0gCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL3J0c3lzdGVtL1BCU1Byb3h5UnVudGltZUNsaWVudC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL3J0c3lzdGVtL1BCU1Byb3h5UnVudGltZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRhNWJlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvY29yZS9ydHN5c3RlbS9QQlNQcm94eVJ1bnRpbWVDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJ0c3lzdGVtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUucm1zeXN0ZW0uSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVByb3h5UnVudGltZUNsaWVudDsNCi0NCi1wdWJsaWMgY2xhc3MgUEJTUHJveHlSdW50aW1lQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVDbGllbnQgew0KLQlwdWJsaWMgUEJTUHJveHlSdW50aW1lQ2xpZW50KElQQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZywgDQotCQkJaW50IGJhc2VNb2RlbElkKSB7DQotCQlzdXBlcihjb25maWcsIGJhc2VNb2RlbElkKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvcnRzeXN0ZW0vUEJTUnVudGltZVN5c3RlbS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy9jb3JlL3J0c3lzdGVtL1BCU1J1bnRpbWVTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxZjAyNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL2NvcmUvcnRzeXN0ZW0vUEJTUnVudGltZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUucnRzeXN0ZW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVByb3h5UnVudGltZVN5c3RlbTsNCi0NCi1wdWJsaWMgY2xhc3MgUEJTUnVudGltZVN5c3RlbSBleHRlbmRzIEFic3RyYWN0UmVtb3RlUHJveHlSdW50aW1lU3lzdGVtIHsNCi0JcHVibGljIFBCU1J1bnRpbWVTeXN0ZW0oUEJTUHJveHlSdW50aW1lQ2xpZW50IHByb3h5LCBBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBtYW5hZ2VyKSB7DQotCQlzdXBlcihwcm94eSwgbWFuYWdlcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvLmNwcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvLmNwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDFiNjU4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5Ly5jcHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9maWxlVmVyc2lvbiA0LjAuMD8+Ci0KLTxjcHJvamVjdCBzdG9yYWdlX3R5cGVfaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLlhtbFByb2plY3REZXNjcmlwdGlvblN0b3JhZ2UiPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIj4KLTxjY29uZmlndXJhdGlvbiBpZD0iMC4xNDUxMDk3OTk5Ij4KLTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiIGlkPSIwLjE0NTEwOTc5OTkiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iRGVmYXVsdCI+Ci08ZXh0ZXJuYWxTZXR0aW5ncy8+Ci08ZXh0ZW5zaW9ucz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLlZDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0FTRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0xERXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuTWFrZUVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KLTwvZXh0ZW5zaW9ucz4KLTwvc3RvcmFnZU1vZHVsZT4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPgotPGNvbmZpZ3VyYXRpb24gYXJ0aWZhY3ROYW1lPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkiIGJ1aWxkUHJvcGVydGllcz0iIiBkZXNjcmlwdGlvbj0iIiBpZD0iMC4xNDUxMDk3OTk5IiBuYW1lPSJEZWZhdWx0IiBwYXJlbnQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnByZWZiYXNlLmNmZyI+Ci08Zm9sZGVySW5mbyBpZD0iMC4xNDUxMDk3OTk5LiIgbmFtZT0iLyIgcmVzb3VyY2VQYXRoPSIiPgotPHRvb2xDaGFpbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUucHJlZmJhc2UudG9vbGNoYWluLjE5Mzk2NjU1NTUiIG5hbWU9Ik5vIFRvb2xDaGFpbiIgcmVzb3VyY2VUeXBlQmFzZWREaXNjb3Zlcnk9ImZhbHNlIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5wcmVmYmFzZS50b29sY2hhaW4iPgotPHRhcmdldFBsYXRmb3JtIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5wcmVmYmFzZS50b29sY2hhaW4uMTkzOTY2NTU1NS4xNDE1MjEzMzE0IiBuYW1lPSIiLz4KLTxidWlsZGVyIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5kZWZhdWx0LmJ1aWxkZXIuMzc5NTAzOTY3IiBrZWVwRW52aXJvbm1lbnRJbkJ1aWxkZmlsZT0iZmFsc2UiIG1hbmFnZWRCdWlsZE9uPSJmYWxzZSIgbmFtZT0iR251IE1ha2UgQnVpbGRlciIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuZGVmYXVsdC5idWlsZGVyIi8+Ci08dG9vbCBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmxpYnMuMTgzNTMxMzQ4MCIgbmFtZT0iaG9sZGVyIGZvciBsaWJyYXJ5IHNldHRpbmdzIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIubGlicyIvPgotPHRvb2wgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci4zNTQyMjY1NjEiIG5hbWU9IkdOVSBDKysiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlciI+Ci08aW5wdXRUeXBlIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlLjkwOTE3Njc4MCIgbGFuZ3VhZ2VJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZysrIiBsYW5ndWFnZU5hbWU9IkdOVSBDKysiIHNvdXJjZUNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5jeHhTb3VyY2Usb3JnLmVjbGlwc2UuY2R0LmNvcmUuY3h4SGVhZGVyIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlIi8+Ci08L3Rvb2w+Ci08dG9vbCBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLjQxOTQxMzAyOSIgbmFtZT0iR05VIEMiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlciI+Ci08aW5wdXRUeXBlIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlLjEzMDE3MzkxMzQiIGxhbmd1YWdlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmdjYyIgbGFuZ3VhZ2VOYW1lPSJHTlUgQyIgc291cmNlQ29udGVudFR5cGU9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmNTb3VyY2Usb3JnLmVjbGlwc2UuY2R0LmNvcmUuY0hlYWRlciIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmluVHlwZSIvPgotPC90b29sPgotPHRvb2wgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci4xMjQ2NDcxNDQ5IiBuYW1lPSJBc3NlbWJseSIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyIj4KLTxpbnB1dFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci5pblR5cGUuMjEzNTIyOTMyNyIgbGFuZ3VhZ2VJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuYXNzZW1ibHkiIGxhbmd1YWdlTmFtZT0iQXNzZW1ibHkiIHNvdXJjZUNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5hc21Tb3VyY2UiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci5pblR5cGUiLz4KLTwvdG9vbD4KLTwvdG9vbENoYWluPgotPC9mb2xkZXJJbmZvPgotPC9jb25maWd1cmF0aW9uPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iMC4xNDUxMDk3OTk5Ij4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4KLTwvY2NvbmZpZ3VyYXRpb24+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KLTxwcm9qZWN0IGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkubnVsbC4xNjQ3NzQ3ODg1IiBuYW1lPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkiLz4KLTwvc3RvcmFnZU1vZHVsZT4KLTwvY3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjcwYWMyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmdlbm1ha2VidWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmNsZWFuLGZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+P25hbWU/PC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmFwcGVuZF9lbnZpcm9ubWVudDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYXV0b0J1aWxkVGFyZ2V0PC9rZXk+Ci0JCQkJCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkQXJndW1lbnRzPC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkQ29tbWFuZDwva2V5PgotCQkJCQk8dmFsdWU+bWFrZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuY2xlYW5CdWlsZFRhcmdldDwva2V5PgotCQkJCQk8dmFsdWU+Y2xlYW48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmNvbnRlbnRzPC9rZXk+Ci0JCQkJCTx2YWx1ZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmFjdGl2ZUNvbmZpZ1NldHRpbmdzPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVBdXRvQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPmZhbHNlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVDbGVhbkJ1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVGdWxsQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmZ1bGxCdWlsZFRhcmdldDwva2V5PgotCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5zdG9wT25FcnJvcjwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUudXNlRGVmYXVsdEJ1aWxkQ21kPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5TY2FubmVyQ29uZmlnQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY25hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLm1hbmFnZWRCdWlsZE5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLlNjYW5uZXJDb25maWdOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L0FVVEhPUlMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L0FVVEhPUlMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvQ09QWUlORyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTA1OGYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDA5IFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYSAKLQotVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9DaGFuZ2VMb2cgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L0lOU1RBTEwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9JTlNUQUxMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBjNDJmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L0lOU1RBTEwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TZWUgUkVBRE1FIGZvciBidWlsZC9pbnN0YWxsIGluc3RydWN0aW9ucy4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjVjYTcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS5wcm94eQ0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1DcmVhdGVkLUJ5OiAxLjUuMF8xMy0xMTkgKEFwcGxlIEluYy4pDQotQnVuZGxlLU5hbWU6IFBUUCBQcm94eSBTZXJ2ZXIgZm9yIE9wZW5SVEUNCi1CdW5kbGUtVmVyc2lvbjogMi4wLjEuMjAwODA2MDYxNTE1DQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMA0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5wdHAudXRpbHMsb3JnLmVjbGlwc2UucHRwLnByb3h5DQotDQotTmFtZTogY29uZmlndXJlLmluDQotU0hBMS1EaWdlc3Q6IDZ6RWI3Z2xrQys4cmR3d3J4QTVLREZVT2d5ST0NCi0NCi1OYW1lOiBNYWtlZmlsZS5hbQ0KLVNIQTEtRGlnZXN0OiBST0hZdWJnSHdCWVRWUElYVE5odTRSMTEybDg9DQotDQotTmFtZTogY29uZmlndXJlDQotU0hBMS1EaWdlc3Q6IGF4Q2VQMVRsSU5LKzd3UzVsSFgyMDBSSVdLZz0NCi0NCi1OYW1lOiBDaGFuZ2VMb2cNCi1TSEExLURpZ2VzdDogMmptajdsNXJTdzB5VmIvdmxXQVlrSy9ZQndrPQ0KLQ0KLU5hbWU6IElOU1RBTEwNCi1TSEExLURpZ2VzdDogdXMwZTA3MFR1NGdYbitucXdpZmlMT0dwYklRPQ0KLQ0KLU5hbWU6IGFib3V0Lmh0bWwNCi1TSEExLURpZ2VzdDogNjd0Ujd6RGc1elpUU3FreTFIYXZTcmMrSVkwPQ0KLQ0KLU5hbWU6IGNvbXBpbGUNCi1TSEExLURpZ2VzdDogOXladHJ0cmNHa3ZoYmtieVZKdUV0d3p3SjljPQ0KLQ0KLU5hbWU6IE1ha2VmaWxlLmluDQotU0hBMS1EaWdlc3Q6IHhPdjJaKzZlTjJlUVRtbFdLb2d1ZmRrTG9paz0NCi0NCi1OYW1lOiBDT1BZSU5HDQotU0hBMS1EaWdlc3Q6IHFQZytWc2xpVFRCdTlQajVsUXpHT3lOTjYxST0NCi0NCi1OYW1lOiBzcmMvcHRwX29ydGVfcHJveHkuYw0KLVNIQTEtRGlnZXN0OiBjMjZZWENLbXlta2l1ZGlGOGc2NzdKcG00bUk9DQotDQotTmFtZTogbHRtYWluLnNoDQotU0hBMS1EaWdlc3Q6IEZSYlZJV3N5N1gzV1c2Ym1TYzFZWlg3a2lyaz0NCi0NCi1OYW1lOiBkZXBjb21wDQotU0hBMS1EaWdlc3Q6IFhYUWxxY0NLWnNNWGZ4NHhLRytrQ1liL3laWT0NCi0NCi1OYW1lOiBBVVRIT1JTDQotU0hBMS1EaWdlc3Q6IDVVUkh2Z09GTUZ0TGVxUGd3cUZvcUFFaWppMD0NCi0NCi1OYW1lOiBORVdTDQotU0hBMS1EaWdlc3Q6IDJqbWo3bDVyU3cweVZiL3ZsV0FZa0svWUJ3az0NCi0NCi1OYW1lOiBtaXNzaW5nDQotU0hBMS1EaWdlc3Q6IGhPRkpXdXZoQkxwbzhTUzhOZ2JMU2h0ZmJIbz0NCi0NCi1OYW1lOiBzcmMvb3J0ZV9maXh1cC5oDQotU0hBMS1EaWdlc3Q6IHpqZjJ0T1BaRVBPYUhObjVGV1ArM3BZTlZsbz0NCi0NCi1OYW1lOiBhY2xvY2FsLm00DQotU0hBMS1EaWdlc3Q6IC8zNmo0ZXUyUS8raU15Q2xoajhRRWtXSHFIMD0NCi0NCi1OYW1lOiBpbnN0YWxsLXNoDQotU0hBMS1EaWdlc3Q6IEt4Z2w0VVJEOHhtQXFLT29CeDJ6MWdqaVRFMD0NCi0NCi1OYW1lOiBSRUFETUUNCi1TSEExLURpZ2VzdDogM0hOQ3ppSUZERzg4NTdXY1NNOVkwWW04bkFFPQ0KLQ0KLU5hbWU6IGNvbmZpZy5oLmluDQotU0hBMS1EaWdlc3Q6IFpnOU1GaXA2REQ5bmtOK1NtdTNlR2txZXd0TT0NCi0NCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZg0KLVNIQTEtRGlnZXN0OiAwOWdOMDV0b2JnUy9NZHRxeVROUWhPaEI3M009DQotDQotTmFtZTogY29uZmlnLnN1Yg0KLVNIQTEtRGlnZXN0OiBiaXh2T2dKclNoamNWVGpnakxwanJYTUpMTzA9DQotDQotTmFtZTogY29uZmlnLnN0YXR1cw0KLVNIQTEtRGlnZXN0OiBuWVVKZ2R4YXdaYkFVVDhQbm41M2xBcUZYMlU9DQotDQotTmFtZTogY29uZmlnLmd1ZXNzDQotU0hBMS1EaWdlc3Q6IHNXQ08xREdJSFpzQWNBVjIybSszNXFLT2RnVT0NCi0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9NRVRBLUlORi9lY2xpcHNlLmluZiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmZmZWQyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L01FVEEtSU5GL2VjbGlwc2UuaW5mCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jUHJvY2Vzc2VkIHVzaW5nIEphcnByb2Nlc3NvcgotcGFjazIwMC5jb25kaXRpb25lZCA9IHRydWUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L01ha2VmaWxlLmFtIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmVhZmIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotYmluX1BST0dSQU1TID0JcHRwX3Bic19wcm94eQotCi1wdHBfcGJzX3Byb3h5X1NPVVJDRVMgPQlzcmMvcHRwX3Bic19wcm94eS5jIAotcHRwX3Bic19wcm94eV9DRkxBR1MgPQktZyAkKEFNX0NGTEFHUykKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L01ha2VmaWxlLmluIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjc1ZTIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMCBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLVZQQVRIID0gQHNyY2RpckAKLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotYmluX1BST0dSQU1TID0gcHRwX3Bic19wcm94eSQoRVhFRVhUKQotc3ViZGlyID0gLgotRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9jb25maWcuaC5pbiBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgQVVUSE9SUyBDT1BZSU5HIENoYW5nZUxvZyBJTlNUQUxMIE5FV1MgXAotCWNvbXBpbGUgY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgZGVwY29tcCBpbnN0YWxsLXNoIG1pc3NpbmcKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1hbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAotIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlnLnN0YXR1cy5saW5lbm8KLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1hbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoYmluZGlyKSIKLWJpblBST0dSQU1TX0lOU1RBTEwgPSAkKElOU1RBTExfUFJPR1JBTSkKLVBST0dSQU1TID0gJChiaW5fUFJPR1JBTVMpCi1hbV9fZGlyc3RhbXAgPSAkKGFtX19sZWFkaW5nX2RvdClkaXJzdGFtcAotYW1fcHRwX3Bic19wcm94eV9PQkpFQ1RTID0gc3JjL3B0cF9wYnNfcHJveHktcHRwX3Bic19wcm94eS4kKE9CSkVYVCkKLXB0cF9wYnNfcHJveHlfT0JKRUNUUyA9ICQoYW1fcHRwX3Bic19wcm94eV9PQkpFQ1RTKQotcHRwX3Bic19wcm94eV9MREFERCA9ICQoTERBREQpCi1wdHBfcGJzX3Byb3h5X0xJTksgPSAkKENDTEQpICQocHRwX3Bic19wcm94eV9DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQAotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLVNPVVJDRVMgPSAkKHB0cF9wYnNfcHJveHlfU09VUkNFUykKLURJU1RfU09VUkNFUyA9ICQocHRwX3Bic19wcm94eV9TT1VSQ0VTKQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAotICB7IHRlc3QgISAtZCAkKGRpc3RkaXIpIFwKLSAgICB8fCB7IGZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKLSAgICAgICAgICYmIHJtIC1mciAkKGRpc3RkaXIpOyB9OyB9Ci1ESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKLUdaSVBfRU5WID0gLS1iZXN0Ci1kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1kaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFXSyA9IEBBV0tACi1DQyA9IEBDQ0AKLUNDREVQTU9ERSA9IEBDQ0RFUE1PREVACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQID0gQENQUEAKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HUkVQID0gQEdSRVBACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LRElSX1AgPSBATUtESVJfUEAKLU9CSkVYVCA9IEBPQkpFWFRACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLVBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACi1QQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKLVBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACi1QQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAotUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACi1QQlNESVIgPSBAUEJTRElSQAotUkFOTElCID0gQFJBTkxJQkAKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TVFJJUCA9IEBTVFJJUEAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWFic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACi1hYnNfc3JjZGlyID0gQGFic19zcmNkaXJACi1hYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACi1hYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKLWFjX2N0X0NDID0gQGFjX2N0X0NDQAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWh0bWxkaXIgPSBAaHRtbGRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLWluc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKLWxpYmRpciA9IEBsaWJkaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1sb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLW1rZGlyX3AgPSBAbWtkaXJfcEAKLW9sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKLXBkZmRpciA9IEBwZGZkaXJACi1wcmVmaXggPSBAcHJlZml4QAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotcHNkaXIgPSBAcHNkaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLXNyY2RpciA9IEBzcmNkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLXB0cF9wYnNfcHJveHlfU09VUkNFUyA9IHNyYy9wdHBfcGJzX3Byb3h5LmMgCi1wdHBfcGJzX3Byb3h5X0NGTEFHUyA9IC1nICQoQU1fQ0ZMQUdTKQotYWxsOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5vYmoKLWFtLS1yZWZyZXNoOgotCUA6Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgJzsgXAotCSAgICAgIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgXAotCQkmJiBleGl0IDA7IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZSc7IFwKLQljZCAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCi0JICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpICQoQUNMT0NBTF9BTUZMQUdTKQotCi1jb25maWcuaDogc3RhbXAtaDEKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkgIHJtIC1mIHN0YW1wLWgxOyBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBzdGFtcC1oMTsgXAotCWVsc2UgOjsgZmkKLQotc3RhbXAtaDE6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBybSAtZiBzdGFtcC1oMQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKLSQoc3JjZGlyKS9jb25maWcuaC5pbjogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlybSAtZiBzdGFtcC1oMQotCXRvdWNoICRACi0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgxCi1pbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKGJpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgcDE9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKLQkgIGlmIHRlc3QgLWYgJCRwIFwKLQkgIDsgdGhlbiBcCi0JICAgIGY9YGVjaG8gIiQkcDEiIHwgc2VkICdzLF4uKi8sLDskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICckJHAnICckKERFU1RESVIpJChiaW5kaXIpLyQkZiciOyBcCi0JICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICIkJHAiICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBmPWBlY2hvICIkJHAiIHwgc2VkICdzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKLQkgIHJtIC1mICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiI7IFwKLQlkb25lCi0KLWNsZWFuLWJpblBST0dSQU1TOgotCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQotc3JjLyQoYW1fX2RpcnN0YW1wKToKLQlAJChNS0RJUl9QKSBzcmMKLQlAOiA+IHNyYy8kKGFtX19kaXJzdGFtcCkKLXNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgotCUAkKE1LRElSX1ApIHNyYy8kKERFUERJUikKLQlAOiA+IHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvcHRwX3Bic19wcm94eS1wdHBfcGJzX3Byb3h5LiQoT0JKRVhUKTogc3JjLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXB0cF9wYnNfcHJveHkkKEVYRUVYVCk6ICQocHRwX3Bic19wcm94eV9PQkpFQ1RTKSAkKHB0cF9wYnNfcHJveHlfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgcHRwX3Bic19wcm94eSQoRVhFRVhUKQotCSQocHRwX3Bic19wcm94eV9MSU5LKSAkKHB0cF9wYnNfcHJveHlfT0JKRUNUUykgJChwdHBfcGJzX3Byb3h5X0xEQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9wdHBfcGJzX3Byb3h5LXB0cF9wYnNfcHJveHkuJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvJChERVBESVIpL3B0cF9wYnNfcHJveHktcHRwX3Bic19wcm94eS5Qb0BhbV9fcXVvdGVACi0KLS5jLm86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5vJCR8fCdgO1wKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgJDwgJiZcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkJGRlcGJhc2UuVHBvICQkZGVwYmFzZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotLmMub2JqOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJZGVwYmFzZT1gZWNobyAkQCB8IHNlZCAnc3xbXi9dKiQkfCQoREVQRElSKS8mfDtzfFwub2JqJCR8fCdgO1wKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYCAmJlwKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi0KLXNyYy9wdHBfcGJzX3Byb3h5LXB0cF9wYnNfcHJveHkubzogc3JjL3B0cF9wYnNfcHJveHkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHRwX3Bic19wcm94eV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3B0cF9wYnNfcHJveHktcHRwX3Bic19wcm94eS5vIC1NRCAtTVAgLU1GIHNyYy8kKERFUERJUikvcHRwX3Bic19wcm94eS1wdHBfcGJzX3Byb3h5LlRwbyAtYyAtbyBzcmMvcHRwX3Bic19wcm94eS1wdHBfcGJzX3Byb3h5Lm8gYHRlc3QgLWYgJ3NyYy9wdHBfcGJzX3Byb3h5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wdHBfcGJzX3Byb3h5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy8kKERFUERJUikvcHRwX3Bic19wcm94eS1wdHBfcGJzX3Byb3h5LlRwbyBzcmMvJChERVBESVIpL3B0cF9wYnNfcHJveHktcHRwX3Bic19wcm94eS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3B0cF9wYnNfcHJveHkuYycgb2JqZWN0PSdzcmMvcHRwX3Bic19wcm94eS1wdHBfcGJzX3Byb3h5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHB0cF9wYnNfcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3B0cF9wYnNfcHJveHktcHRwX3Bic19wcm94eS5vIGB0ZXN0IC1mICdzcmMvcHRwX3Bic19wcm94eS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHRwX3Bic19wcm94eS5jCi0KLXNyYy9wdHBfcGJzX3Byb3h5LXB0cF9wYnNfcHJveHkub2JqOiBzcmMvcHRwX3Bic19wcm94eS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwdHBfcGJzX3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvcHRwX3Bic19wcm94eS1wdHBfcGJzX3Byb3h5Lm9iaiAtTUQgLU1QIC1NRiBzcmMvJChERVBESVIpL3B0cF9wYnNfcHJveHktcHRwX3Bic19wcm94eS5UcG8gLWMgLW8gc3JjL3B0cF9wYnNfcHJveHktcHRwX3Bic19wcm94eS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wdHBfcGJzX3Byb3h5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3B0cF9wYnNfcHJveHkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3B0cF9wYnNfcHJveHkuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjLyQoREVQRElSKS9wdHBfcGJzX3Byb3h5LXB0cF9wYnNfcHJveHkuVHBvIHNyYy8kKERFUERJUikvcHRwX3Bic19wcm94eS1wdHBfcGJzX3Byb3h5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHRwX3Bic19wcm94eS5jJyBvYmplY3Q9J3NyYy9wdHBfcGJzX3Byb3h5LXB0cF9wYnNfcHJveHkub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwdHBfcGJzX3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9wdHBfcGJzX3Byb3h5LXB0cF9wYnNfcHJveHkub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHRwX3Bic19wcm94eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wdHBfcGJzX3Byb3h5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wdHBfcGJzX3Byb3h5LmMnOyBmaWAKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHRhZ3MgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmIGNkICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JdGVzdCAtZCAkKGRpc3RkaXIpIHx8IG1rZGlyICQoZGlzdGRpcikKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCS1maW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC03NzcgLWV4ZWMgY2htb2QgYStyd3gge30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCi0JfHwgY2htb2QgLVIgYStyICQoZGlzdGRpcikKLWRpc3QtZ3ppcDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtYnppcDI6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXRhclo6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1zaGFyOiBkaXN0ZGlyCi0Jc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC16aXA6IGRpc3RkaXIKLQktcm0gLWYgJChkaXN0ZGlyKS56aXAKLQl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdCBkaXN0LWFsbDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKLQkqLnRhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmJ6MiopIFwKLQkgIGJ1bnppcDIgLWMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLloqKSBcCi0JICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCi0JKi5zaGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAotCSouemlwKikgXAotCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCi0JZXNhYwotCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS9faW5zdAotCWNobW9kIGEtdyAkKGRpc3RkaXIpCi0JZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCi0JICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKLQkgICYmIGNkICQoZGlzdGRpcikvX2J1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAotCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgJiYgKHsgXAotCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCi0JICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKLQkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKLQkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKLQkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKLQkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKLQkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JwotZGlzdHVuaW5zdGFsbGNoZWNrOgotCUBjZCAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpIFwKLQkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKLQkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAotCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAotCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAotCSAgICAgICAgZmkgOyBcCi0JICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICAgZXhpdCAxOyB9ID4mMgotZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgotCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAotCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCi0JICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKLQkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICBleGl0IDE7IH0gPiYyCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgY29uZmlnLmgKLWluc3RhbGxkaXJzOgotCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGJpbmRpcikiOyBkbyBcCi0JICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCi0JZG9uZQotaW5zdGFsbDogaW5zdGFsbC1hbQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBzcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotCS1ybSAtZiBzcmMvJChhbV9fZGlyc3RhbXApCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLWFtCi0KLWNsZWFuLWFtOiBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiBzcmMvJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLWFtCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1hbQotCi1pbmZvOiBpbmZvLWFtCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUwotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiAkKHRvcF9zcmNkaXIpL2F1dG9tNHRlLmNhY2hlCi0JLXJtIC1yZiBzcmMvJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUwotCi0uTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjbGVhbiBcCi0JY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjdGFncyBkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgXAotCWRpc3QtZ3ppcCBkaXN0LXNoYXIgZGlzdC10YXJaIGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gXAotCWRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBcCi0JZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKLQlpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgXAotCWluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIFwKLQlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCi0JaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKLQlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAotCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKLQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCi0JdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1iaW5QUk9HUkFNUwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9ORVdTIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9ORVdTCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L1JFQURNRSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9SRUFETUUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvYWJvdXQuaHRtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvYWNsb2NhbC5tNCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTgxNjQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDkwOCArMCwwIEBACi0jIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMCAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotbTRfaWYobTRfUEFDS0FHRV9WRVJTSU9OLCBbMi42MV0sLAotW200X2ZhdGFsKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42MS4KLVlvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGF0LAoteW91IHNob3VsZCByZWdlbmVyYXRlIHRoZSBidWlsZCBzeXN0ZW0gZW50aXJlbHkuXSwgWzYzXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCi0jIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgotIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKLUFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKLVthbV9fYXBpX3ZlcnNpb249JzEuMTAnCi1kbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCi1kbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgotbTRfaWYoWyQxXSwgWzEuMTBdLCBbXSwKLSAgICAgIFtBQ19GQVRBTChbRG8gbm90IGNhbGwgJDAsIHVzZSBBTV9JTklUX0FVVE9NQUtFKFskMV0pLl0pXSlkbmwKLV0pCi0KLSMgX0FNX0FVVE9DT05GX1ZFUlNJT04oVkVSU0lPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgYWNsb2NhbCB0cmFjZXMgdGhpcyBtYWNybyB0byBmaW5kIHRoZSBBdXRvY29uZiB2ZXJzaW9uLgotIyBUaGlzIGlzIGEgcHJpdmF0ZSBtYWNybyB0b28uICBVc2luZyBtNF9kZWZpbmUgc2ltcGxpZmllcwotIyB0aGUgbG9naWMgaW4gYWNsb2NhbCwgd2hpY2ggY2FuIHNpbXBseSBpZ25vcmUgdGhpcyBkZWZpbml0aW9uLgotbTRfZGVmaW5lKFtfQU1fQVVUT0NPTkZfVkVSU0lPTl0sIFtdKQotCi0jIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gdGhleSBjYW4gYmUgdHJhY2VkLgotIyBUaGlzIGZ1bmN0aW9uIGlzIEFDX1JFUVVJUkVkIGJ5IEFDX0lOSVRfQVVUT01BS0UuCi1BQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sCi1bQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xMF0pZG5sCi1fQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9QQUNLQUdFX1ZFUlNJT04pXSkKLQotIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCi0jICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCi0jIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCi0jCi0jIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKLSMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKLSMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCi0jIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQotIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAotIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKLSMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KLSMKLSMgJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCi0jICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKLSMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCi0jICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKLSMKLSMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKLSMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKLSMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91Ci0jIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCi0jCi0jIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAotIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKLSMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKLSMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCi0jICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCi0jIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCi0jIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KLSMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgotIwotIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KLSMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQotIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCi0KLUFDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCi1bZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KLUFDX1BSRVJFUShbMi41MF0pZG5sCi0jIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCi1hbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1dKQotCi0jIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDgKLQotIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi1BQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAotW0FDX1BSRVJFUSgyLjUyKWRubAotIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCi0JWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAotQUNfU1VCU1QoWyQxX1RSVUVdKWRubAotQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maQotQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKLVtpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQotZmldKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDkKLQotIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKLSMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCi0jIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncwotIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCi0jIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KLQotCi0jIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCi0jIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCi0jIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCi0jCi0jIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcwotIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgotIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCi0jIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgotQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAotQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAotQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCi0KLWlmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQotCi1BQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAotICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKLVtpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKLSAgZmkKLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgY2FzZSAkZGVwbW9kZSBpbgotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KLSAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKLSAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKLSAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCi0gICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KLSAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCi0gICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKLSAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAotICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgICAgICAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotCi0gIGNkIC4uCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLWVsc2UKLSAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLV0pCi1BQ19TVUJTVChbJDFERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSkKLUFNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcCQxXSwgWwotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCi1dKQotCi0KLSMgQU1fU0VUX0RFUERJUgotIyAtLS0tLS0tLS0tLS0tCi0jIENob29zZSBhIGRpcmVjdG9yeSBuYW1lIGZvciBkZXBlbmRlbmN5IGZpbGVzLgotIyBUaGlzIG1hY3JvIGlzIEFDX1JFUVVJUkVkIGluIF9BTV9ERVBFTkRFTkNJRVMKLUFDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKLVtBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAotXSkKLQotCi0jIEFNX0RFUF9UUkFDSwotIyAtLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAotW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKLVsgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLUFNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQotQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCi1dKQotCi0jIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSNzZXJpYWwgMwotCi0jIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotW2ZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbwotICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAotICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgotICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQotICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KLSAgaWYgc2VkIDEwcSAiJG1mIiB8IGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKLSAgZWxzZQotICAgIGNvbnRpbnVlCi0gIGZpCi0gICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KLSAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAotICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCi0gICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICMgZXhwYW5zaW9uLgotICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKLSAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLSAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KLSAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCi0gICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQotICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCi0gIGRvbmUKLWRvbmUKLV0pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLQotCi0jIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KLSMKLSMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZwotIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCi0jIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCi1BQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAotICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLSAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQotXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOAotCi0jIEFNX0NPTkZJR19IRUFERVIgaXMgb2Jzb2xldGUuICBJdCBoYXMgYmVlbiByZXBsYWNlZCBieSBBQ19DT05GSUdfSEVBREVSUy4KLUFVX0RFRlVOKFtBTV9DT05GSUdfSEVBREVSXSwgW0FDX0NPTkZJR19IRUFERVJTKCRAKV0pCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCi0jIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMTIKLQotIyBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2guICBTb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYKLSMgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuICBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBBTV9JTklUX0FVVE9NQUtFKFBBQ0tBR0UsIFZFUlNJT04sIFtOTy1ERUZJTkVdKQotIyBBTV9JTklUX0FVVE9NQUtFKFtPUFRJT05TXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhlIGNhbGwgd2l0aCBQQUNLQUdFIGFuZCBWRVJTSU9OIGFyZ3VtZW50cyBpcyB0aGUgb2xkIHN0eWxlCi0jIGNhbGwgKHByZSBhdXRvY29uZi0yLjUwKSwgd2hpY2ggaXMgYmVpbmcgcGhhc2VkIG91dC4gIFBBQ0tBR0UKLSMgYW5kIFZFUlNJT04gc2hvdWxkIG5vdyBiZSBwYXNzZWQgdG8gQUNfSU5JVCBhbmQgcmVtb3ZlZCBmcm9tCi0jIHRoZSBjYWxsIHRvIEFNX0lOSVRfQVVUT01BS0UuCi0jIFdlIHN1cHBvcnQgYm90aCBjYWxsIHN0eWxlcyBmb3IgdGhlIHRyYW5zaXRpb24uICBBZnRlcgotIyB0aGUgbmV4dCBBdXRvbWFrZSByZWxlYXNlLCBBdXRvY29uZiBjYW4gbWFrZSB0aGUgQUNfSU5JVAotIyBhcmd1bWVudHMgbWFuZGF0b3J5LCBhbmQgdGhlbiB3ZSBjYW4gZGVwZW5kIG9uIGEgbmV3IEF1dG9jb25mCi0jIHJlbGVhc2UgYW5kIGRyb3AgdGhlIG9sZCBjYWxsIHN1cHBvcnQuCi1BQ19ERUZVTihbQU1fSU5JVF9BVVRPTUFLRV0sCi1bQUNfUFJFUkVRKFsyLjYwXSlkbmwKLWRubCBBdXRvY29uZiB3YW50cyB0byBkaXNhbGxvdyBBTV8gbmFtZXMuICBXZSBleHBsaWNpdGx5IGFsbG93Ci1kbmwgdGhlIG9uZXMgd2UgY2FyZSBhYm91dC4KLW00X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHUyRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgotICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAotICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCi0gIEFDX1NVQlNUKFthbV9faXNyY10sIFsnIC1JJChzcmNkaXIpJ10pX0FNX1NVQlNUX05PVE1BS0UoW2FtX19pc3JjXSlkbmwKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotICBmaQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLUFDX1NVQlNUKFtDWUdQQVRIX1ddKQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi1kbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KLW00X2lmdmFsKFskMl0sCi1bbTRfaWZ2YWwoWyQzXSwgW19BTV9TRVRfT1BUSU9OKFtuby1kZWZpbmVdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWyQyXSldLAotW19BTV9TRVRfT1BUSU9OUyhbJDFdKWRubAotZG5sIERpYWdub3NlIG9sZC1zdHlsZSBBQ19JTklUIHdpdGggbmV3LXN0eWxlIEFNX0FVVE9NQUtFX0lOSVQuCi1tNF9pZihtNF9pZmRlZihbQUNfUEFDS0FHRV9OQU1FXSwgMSltNF9pZmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwgMSksIDExLCwKLSAgW200X2ZhdGFsKFtBQ19JTklUIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBwYWNrYWdlIGFuZCB2ZXJzaW9uIGFyZ3VtZW50c10pXSlkbmwKLSBBQ19TVUJTVChbUEFDS0FHRV0sIFsnQUNfUEFDS0FHRV9UQVJOQU1FJ10pZG5sCi0gQUNfU1VCU1QoW1ZFUlNJT05dLCBbJ0FDX1BBQ0tBR0VfVkVSU0lPTiddKV0pZG5sCi0KLV9BTV9JRl9PUFRJT04oW25vLWRlZmluZV0sLAotW0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLSBBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCi0KLSMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8pCi1BTV9QUk9HX0lOU1RBTExfU0gKLUFNX1BST0dfSU5TVEFMTF9TVFJJUAotQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCi0gICAgICAgICAgICAgIFtfQU1fSUZfT1BUSU9OKFt0YXItcGF4XSwgW19BTV9QUk9HX1RBUihbcGF4XSldLAotCSAgICAgIAkJICAgICBbX0FNX1BST0dfVEFSKFt2N10pXSldKQotX0FNX0lGX09QVElPTihbbm8tZGVwZW5kZW5jaWVzXSwsCi1bQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ0NdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKLSAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfQ0NdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NDXSlbX0FNX0RFUEVOREVOQ0lFUyhDQyldKV0pZG5sCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCi0gICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX09CSkNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX09CSkNdKVtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSldKWRubAotXSkKLV0pCi0KLQotIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLSMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgotCi0jIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCi0jIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKLSMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgotQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAotWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICQxIHwgJDE6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICQxIiA+YEFTX0RJUk5BTUUoWyQxXSlgL3N0YW1wLWhbXSRfYW1fc3RhbXBfY291bnRdKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX0lOU1RBTExfU0gKLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSAkaW5zdGFsbF9zaC4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLWluc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci1BQ19TVUJTVChpbnN0YWxsX3NoKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgQ2hlY2sgd2hldGhlciB0aGUgdW5kZXJseWluZyBmaWxlLXN5c3RlbSBzdXBwb3J0cyBmaWxlbmFtZXMKLSMgd2l0aCBhIGxlYWRpbmcgZG90LiAgRm9yIGluc3RhbmNlIE1TLURPUyBkb2Vzbid0LgotQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCi1bcm0gLXJmIC50c3QgMj4vZGV2L251bGwKLW1rZGlyIC50c3QgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLnRzdDsgdGhlbgotICBhbV9fbGVhZGluZ19kb3Q9LgotZWxzZQotICBhbV9fbGVhZGluZ19kb3Q9XwotZmkKLXJtZGlyIC50c3QgMj4vZGV2L251bGwKLUFDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCi0KLSMgQ2hlY2sgdG8gc2VlIGhvdyAnbWFrZScgdHJlYXRzIGluY2x1ZGVzLgkgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAzCi0KLSMgQU1fTUFLRV9JTkNMVURFKCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgdG8gc2VlIGhvdyBtYWtlIHRyZWF0cyBpbmNsdWRlcy4KLUFDX0RFRlVOKFtBTV9NQUtFX0lOQ0xVREVdLAotW2FtX21ha2U9JHtNQUtFLW1ha2V9Ci1jYXQgPiBjb25maW5jIDw8ICdFTkQnCi1hbV9fZG9pdDoKLQlAZWNobyBkb25lCi0uUEhPTlk6IGFtX19kb2l0Ci1FTkQKLSMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KLUFDX01TR19DSEVDS0lORyhbZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZV0pCi1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKLSMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KLSMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKLSMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCi0jIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KLWlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgotICAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICAgYW1fX3F1b3RlPQotICAgX2FtX3Jlc3VsdD1HTlUKLWZpCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KLSAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgICBhbV9fcXVvdGU9IlwiIgotICAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgIGZpCi1maQotQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKLUFDX1NVQlNUKFthbV9fcXVvdGVdKQotQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQotcm0gLWYgY29uZmluYyBjb25mbWYKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDUKLQotIyBBTV9QUk9HX0NDX0NfTwotIyAtLS0tLS0tLS0tLS0tLQotIyBMaWtlIEFDX1BST0dfQ0NfQ19PLCBidXQgY2hhbmdlZCBmb3IgYXV0b21ha2UuCi1BQ19ERUZVTihbQU1fUFJPR19DQ19DX09dLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NfQ19PXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW2NvbXBpbGVdKWRubAotIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCi0jIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KLXNldCBkdW1teSAkQ0MKLWFjX2NjPWBlY2hvICRbMl0gfCBzZWQgWydzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ11gCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX2NjXycke2FjX2NjfV9jX29gXCIgIT0geWVzIjsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotZG5sIE1ha2Ugc3VyZSBBQ19QUk9HX0NDIGlzIG5ldmVyIGNhbGxlZCBhZ2Fpbiwgb3IgaXQgd2lsbCBvdmVycmlkZSBvdXIKLWRubCBzZXR0aW5nIG9mIENDLgotbTRfZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICBbbTRfZmF0YWwoW0FDX1BST0dfQ0MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciBBTV9QUk9HX0NDX0NfT10pXSkKLV0pCi0KLSMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNQotCi0jIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAotW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCi0kMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBBTV9NSVNTSU5HX0hBU19SVU4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KLSMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgotQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCi1bQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCi10ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKLSMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAotaWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KLSAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKLWVsc2UKLSAgYW1fbWlzc2luZ19ydW49Ci0gIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCi1maQotXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19NS0RJUl9QCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayBmb3IgYG1rZGlyIC1wJy4KLUFDX0RFRlVOKFtBTV9QUk9HX01LRElSX1BdLAotW0FDX1BSRVJFUShbMi42MF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01LRElSX1BdKWRubAotZG5sIEF1dG9tYWtlIDEuOCB0byAxLjkuNiB1c2VkIHRvIGRlZmluZSBta2Rpcl9wLiAgV2Ugbm93IHVzZSBNS0RJUl9QLAotZG5sIHdoaWxlIGtlZXBpbmcgYSBkZWZpbml0aW9uIG9mIG1rZGlyX3AgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1kbmwgQE1LRElSX1BAIGlzIG1hZ2ljOiBBQ19PVVRQVVQgYWRqdXN0cyBpdHMgdmFsdWUgZm9yIGVhY2ggTWFrZWZpbGUuCi1kbmwgSG93ZXZlciB3ZSBjYW5ub3QgZGVmaW5lIG1rZGlyX3AgYXMgJChNS0RJUl9QKSBmb3IgdGhlIHNha2Ugb2YKLWRubCBNYWtlZmlsZS5pbnMgdGhhdCBkbyBub3QgZGVmaW5lIE1LRElSX1AsIHNvIHdlIGRvIG91ciBvd24KLWRubCBhZGp1c3RtZW50IHVzaW5nIHRvcF9idWlsZGRpciAod2hpY2ggaXMgZGVmaW5lZCBtb3JlIG9mdGVuIHRoYW4KLWRubCBNS0RJUl9QKS4KLUFDX1NVQlNUKFtta2Rpcl9wXSwgWyIkTUtESVJfUCJdKWRubAotY2FzZSAkbWtkaXJfcCBpbgotICBbW1xcLyRdXSogfCA/OltbXFwvXV0qKSA7OwotICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Ci1lc2FjCi1dKQotCi0jIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAzCi0KLSMgX0FNX01BTkdMRV9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtfQU1fTUFOR0xFX09QVElPTl0sCi1bW19BTV9PUFRJT05fXW00X2JwYXRzdWJzdCgkMSwgW1teYS16QS1aMC05X11dLCBbX10pXSkKLQotIyBfQU1fU0VUX09QVElPTihOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2V0IG9wdGlvbiBOQU1FLiAgUHJlc2VudGx5IHRoYXQgb25seSBtZWFucyBkZWZpbmluZyBhIGZsYWcgZm9yIHRoaXMgb3B0aW9uLgotQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwKLVttNF9kZWZpbmUoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIDEpXSkKLQotIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPUFRJT05TIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgQXV0b21ha2Ugb3B0aW9ucy4KLUFDX0RFRlVOKFtfQU1fU0VUX09QVElPTlNdLAotW0FDX0ZPUkVBQ0goW19BTV9PcHRpb25dLCBbJDFdLCBbX0FNX1NFVF9PUFRJT04oX0FNX09wdGlvbildKV0pCi0KLSMgX0FNX0lGX09QVElPTihPUFRJT04sIElGLVNFVCwgW0lGLU5PVC1TRVRdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgotQUNfREVGVU4oW19BTV9JRl9PUFRJT05dLAotW200X2lmc2V0KF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbJDJdLCBbJDNdKV0pCi0KLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNAotCi0jIEFNX1NBTklUWV9DSEVDSwotIyAtLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiRbKl0iICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfSU5TVEFMTF9TVFJJUAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT25lIGlzc3VlIHdpdGggdmVuZG9yIGBpbnN0YWxsJyAoZXZlbiBHTlUpIGlzIHRoYXQgeW91IGNhbid0Ci0jIHNwZWNpZnkgdGhlIHByb2dyYW0gdXNlZCB0byBzdHJpcCBiaW5hcmllcy4gIFRoaXMgaXMgZXNwZWNpYWxseQotIyBhbm5veWluZyBpbiBjcm9zcy1jb21waWxpbmcgZW52aXJvbm1lbnRzLCB3aGVyZSB0aGUgYnVpbGQncyBzdHJpcAotIyBpcyB1bmxpa2VseSB0byBoYW5kbGUgdGhlIGhvc3QncyBiaW5hcmllcy4KLSMgRm9ydHVuYXRlbHkgaW5zdGFsbC1zaCB3aWxsIGhvbm9yIGEgU1RSSVBQUk9HIHZhcmlhYmxlLCBzbyB3ZQotIyBhbHdheXMgdXNlIGluc3RhbGwtc2ggaW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcsIGFuZCBpbml0aWFsaXplCi0jIFNUUklQUFJPRyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgU1RSSVAgdmFyaWFibGUgKHNldCBieSB0aGUgdXNlcikuCi1BQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NUUklQXSwKLVtBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU0hdKWRubAotIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCi0jIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0Ci0jIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCi0jIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgotZG5sIERvbid0IHRlc3QgZm9yICRjcm9zc19jb21waWxpbmcgPSB5ZXMsIGJlY2F1c2UgaXQgbWlnaHQgYmUgYG1heWJlJy4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCi0gIEFDX0NIRUNLX1RPT0woW1NUUklQXSwgW3N0cmlwXSwgOikKLWZpCi1JTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgotQUNfU1VCU1QoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgX0FNX1NVQlNUX05PVE1BS0UoVkFSSUFCTEUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcmV2ZW50IEF1dG9tYWtlIGZyb20gb3V0cHV0aW5nIFZBUklBQkxFID0gQFZBUklBQkxFQCBpbiBNYWtlZmlsZS5pbi4KLSMgVGhpcyBtYWNybyBpcyB0cmFjZWQgYnkgQXV0b21ha2UuCi1BQ19ERUZVTihbX0FNX1NVQlNUX05PVE1BS0VdKQotCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgX0FNX1BST0dfVEFSKEZPUk1BVCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KLSMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCi0jIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5Ci0jICR0YXJkaXIuCi0jICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKLSMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KLSMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKLUFDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAotWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLUFNX01JU1NJTkdfUFJPRyhbQU1UQVJdLCBbdGFyXSkKLW00X2lmKFskMV0sIFt2N10sCi0gICAgIFthbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLSddLAotICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAotICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKLUFDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKLSMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KLV9hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCi1fYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQotIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCi0jIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCi1mb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scwotZG8KLSAgY2FzZSAkX2FtX3Rvb2wgaW4KLSAgZ251dGFyKQotICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKLSAgICBkbwotICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKLSAgICA7OwotICBwbGFpbnRhcikKLSAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQotICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCi0gICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQotICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCi0gICAgOzsKLSAgcGF4KQotICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ncGF4IC1yJwotICAgIDs7Ci0gIGNwaW8pCi0gICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJwotICAgIDs7Ci0gIG5vbmUpCi0gICAgYW1fX3Rhcj1mYWxzZQotICAgIGFtX190YXJfPWZhbHNlCi0gICAgYW1fX3VudGFyPWZhbHNlCi0gICAgOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCi0gICMgYW5kIGFtX191bnRhciBzZXQuCi0gIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhawotCi0gICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcwotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCi0gIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KLSAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQotICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhawotICBmaQotZG9uZQotcm0gLXJmIGNvbmZ0ZXN0LmRpcgotCi1BQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCi1BQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCi1BQ19TVUJTVChbYW1fX3Rhcl0pCi1BQ19TVUJTVChbYW1fX3VudGFyXSkKLV0pICMgX0FNX1BST0dfVEFSCi0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbXBpbGUgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9jb21waWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjFkMjMyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbXBpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KLQotc2NyaXB0dmVyc2lvbj0yMDA1LTA1LTE0LjIyCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0Ci0jIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KLSMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgZXhpdCAxOwotICAgICA7OwotICAtaCB8IC0taCopCi0gICAgY2F0IDw8XEVPRgotVXNhZ2U6IGNvbXBpbGUgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KLQotV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kIGAtYyAtbycuCi1SZW1vdmUgYC1vIGRlc3QubycgZnJvbSBBUkdTLCBydW4gUFJPR1JBTSB3aXRoIHRoZSByZW1haW5pbmcKLWFyZ3VtZW50cywgYW5kIHJlbmFtZSB0aGUgb3V0cHV0IGFzIGV4cGVjdGVkLgotCi1JZiB5b3UgYXJlIHRyeWluZyB0byBidWlsZCBhIHdob2xlIHBhY2thZ2UgdGhpcyBpcyBub3QgdGhlCi1yaWdodCBzY3JpcHQgdG8gcnVuOiBwbGVhc2Ugc3RhcnQgYnkgcmVhZGluZyB0aGUgZmlsZSBgSU5TVEFMTCcuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0ICQ/Ci0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAkPwotICAgIDs7Ci1lc2FjCi0KLW9maWxlPQotY2ZpbGU9Ci1lYXQ9Ci0KLWZvciBhcmcKLWRvCi0gIGlmIHRlc3QgLW4gIiRlYXQiOyB0aGVuCi0gICAgZWF0PQotICBlbHNlCi0gICAgY2FzZSAkMSBpbgotICAgICAgLW8pCi0JIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzIGBjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCi0JIyBTbyB3ZSBzdHJpcCBgLW8gYXJnJyBvbmx5IGlmIGFyZyBpcyBhbiBvYmplY3QuCi0JZWF0PTEKLQljYXNlICQyIGluCi0JICAqLm8gfCAqLm9iaikKLQkgICAgb2ZpbGU9JDIKLQkgICAgOzsKLQkgICopCi0JICAgIHNldCB4ICIkQCIgLW8gIiQyIgotCSAgICBzaGlmdAotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgKi5jKQotCWNmaWxlPSQxCi0Jc2V0IHggIiRAIiAiJDEiCi0Jc2hpZnQKLQk7OwotICAgICAgKikKLQlzZXQgeCAiJEAiICIkMSIKLQlzaGlmdAotCTs7Ci0gICAgZXNhYwotICBmaQotICBzaGlmdAotZG9uZQotCi1pZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KLSAgIyBJZiBubyBgLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQotICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCi0gICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KLSAgIyBgLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbwotICAjIG9rLgotICBleGVjICIkQCIKLWZpCi0KLSMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCi1jb2ZpbGU9YGVjaG8gIiRjZmlsZSIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLmMkLy5vLydgCi0KLSMgQ3JlYXRlIHRoZSBsb2NrIGRpcmVjdG9yeS4KLSMgTm90ZTogdXNlIGBbLy4tXScgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIHNhbWUgbmFtZQotIyB0aGF0IHdlIGFyZSB1c2luZyBmb3IgdGhlIC5vIGZpbGUuICBBbHNvLCBiYXNlIHRoZSBuYW1lIG9uIHRoZSBleHBlY3RlZAotIyBvYmplY3QgZmlsZSBuYW1lLCBzaW5jZSB0aGF0IGlzIHdoYXQgbWF0dGVycyB3aXRoIGEgcGFyYWxsZWwgYnVpbGQuCi1sb2NrZGlyPWBlY2hvICIkY29maWxlIiB8IHNlZCAtZSAnc3xbLy4tXXxffGcnYC5kCi13aGlsZSB0cnVlOyBkbwotICBpZiBta2RpciAiJGxvY2tkaXIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGJyZWFrCi0gIGZpCi0gIHNsZWVwIDEKLWRvbmUKLSMgRklYTUU6IHJhY2UgY29uZGl0aW9uIGhlcmUgaWYgdXNlciBraWxscyBiZXR3ZWVuIG1rZGlyIGFuZCB0cmFwLgotdHJhcCAicm1kaXIgJyRsb2NrZGlyJzsgZXhpdCAxIiAxIDIgMTUKLQotIyBSdW4gdGhlIGNvbXBpbGUuCi0iJEAiCi1yZXQ9JD8KLQotaWYgdGVzdCAtZiAiJGNvZmlsZSI7IHRoZW4KLSAgbXYgIiRjb2ZpbGUiICIkb2ZpbGUiCi1lbGlmIHRlc3QgLWYgIiR7Y29maWxlfWJqIjsgdGhlbgotICBtdiAiJHtjb2ZpbGV9YmoiICIkb2ZpbGUiCi1maQotCi1ybWRpciAiJGxvY2tkaXIiCi1leGl0ICRyZXQKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvY29uZmlnLmd1ZXNzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTY0ODJkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDE1MDAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgICBJbmMuCi0KLXRpbWVzdGFtcD0nMjAwNi0wNy0wMicKLQotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1Ci1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7Ci0gICAgLS12ZXJzaW9uIHwgLXYgKQotICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi10cmFwICdleGl0IDEnIDEgMiAxNQotCi0jIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCi0jIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCi0jIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKLSMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KLQotIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAotIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgotCi0jIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCi0KLXNldF9jY19mb3JfYnVpbGQ9JwotdHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Ci10cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOwotOiAke1RNUERJUj0vdG1wfSA7Ci0geyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAotIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8Ci0geyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8Ci0geyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOwotZHVtbXk9JHRtcC9kdW1teSA7Ci10bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKLWNhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KLSAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCi0JICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7Ci0JICBmaSA7Ci0JZG9uZSA7Ci0JaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KLQkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7Ci0JZmkKLQk7OwotICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7Ci0gLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OwotZXNhYyA7IHNldF9jY19mb3JfYnVpbGQ9IDsnCi0KLSMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCi0jIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgMTk5NC0wOC0yNCkKLWlmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICi1maQotCi1VTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KLVVOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgotVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KLVVOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgotCi0jIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCi0KLWNhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KLSAgICAqOk5ldEJTRDoqOiopCi0JIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKLQkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCi0JIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKLQkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCi0JIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuCi0JIwotCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgotCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgotCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKLQlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKLQkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKLQljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCi0JICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKLQkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OwotCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OwotCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7Ci0JICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24gOzsKLQllc2FjCi0JIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCi0JIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KLQljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCi0JICAgIGFybSp8aTM4NnxtNjhrfG5zMzJrfHNoMyp8c3BhcmN8dmF4KQotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCi0JCQl8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsCi0JCXRoZW4KLQkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KLQkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPwotCQkgICAgb3M9bmV0YnNkCi0JCWVsc2UKLQkJICAgIG9zPW5ldGJzZGVsZgotCQlmaQotCQk7OwotCSAgICAqKQotCSAgICAgICAgb3M9bmV0YnNkCi0JCTs7Ci0JZXNhYwotCSMgVGhlIE9TIHJlbGVhc2UKLQkjIERlYmlhbiBHTlUvTmV0QlNEIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgdXNlcmxhbmQsIGFuZAotCSMgdGh1cywgbmVlZCBhIGRpc3RpbmN0IHRyaXBsZXQuIEhvd2V2ZXIsIHRoZXkgZG8gbm90IG5lZWQKLQkjIGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhCi0JIyBzdWl0YWJsZSB0YWcsIGluIHRoZSBzdHlsZSBvZiBsaW51eC1nbnUuCi0JY2FzZSAiJHtVTkFNRV9WRVJTSU9OfSIgaW4KLQkgICAgRGViaWFuKikKLQkJcmVsZWFzZT0nLWdudScKLQkJOzsKLQkgICAgKikKLQkJcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQkJOzsKLQllc2FjCi0JIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06Ci0JIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06Ci0JIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgotCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgotCWV4aXQgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKLQllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6ZWtrb0JTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpTb2xpZEJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpNaXJCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYWxwaGE6T1NGMToqOiopCi0JY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgotCSo0LjApCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JCTs7Ci0JKjUuKikKLQkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCi0JCTs7Ci0JZXNhYwotCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCi0JIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKLQkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCi0JIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCi0JQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAotCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KLQkgICAgIkVWNCAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJFVjQuNSAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNSAoMjExNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7Ci0JICAgICJFVjUuNiAoMjExNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKLQkgICAgIkVWNS42ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7Ci0JICAgICJFVjUuNyAoMjExNjRQQykiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OwotCSAgICAiRVY2ICgyMTI2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKLQkgICAgIkVWNi43ICgyMTI2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OwotCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44QUwgKDIxMjY0QikiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOENYICgyMTI2NEQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7Ci0JICAgICJFVjcgKDIxMzY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OwotCSAgICAiRVY3LjkgKDIxMzY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7Ci0JZXNhYwotCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDs7Ci0gICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCi0JIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/Ci0JZWNobyBhbHBoYS1wYy1pbnRlcml4Ci0JZXhpdCA7OwotICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKLQllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCA7OwotICAgICo6T1MvMzkwOio6KikKLQllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCi0JZXhpdCA7OwotICAgICo6ei9WTToqOiopCi0JZWNobyBzMzkwLWlibS16dm1vZQotCWV4aXQgOzsKLSAgICAqOk9TNDAwOio6KikKLSAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAotCWV4aXQgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKLQllY2hvIGFybS11bmtub3duLXJpc2NvcwotCWV4aXQgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgOzsKLSAgICBOSUxFKjoqOio6ZGNvc3gpCi0JZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAotCWV4aXQgOzsKLSAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKLQllY2hvIHNwYXJjLWljbC1ueDYKLQlleGl0IDs7Ci0gICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQotCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgotCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7Ci0JZXNhYyA7OwotICAgIHN1bjRIOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgotICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKLSAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQotICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90Ci0gICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCi0gICAgIyBiZSBubyBwcm9ibGVtLgotICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgbTY4azptYWNodGVuOio6KikKLQllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUklTQyo6TWFjaDoqOiopCi0JZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQotCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCi0JICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgotCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCi0JICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4Ci0JZXhpdCA7OwotICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLSAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKLSAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKLQlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCi0JdGhlbgotCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKLQkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KLQkgICAgdGhlbgotCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQkgICAgZmkKLQllbHNlCi0JICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gCWV4aXQgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQotCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCA7OwotICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKLQkJdGhlbgotCQkJZWNobyAiJFNZU1RFTV9OQU1FIgotCQllbHNlCi0JCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQkJZmkKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOls0NV0pCi0JSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCi0JCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCi0JCWZpIDs7Ci0JZXNhYwotCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQotCXRoZW4KLQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCi0JICAgICMgaHBwYTIuMHctaHAtaHB1eCogaGFzIGEgNjQtYml0IGtlcm5lbCBhbmQgYSBjb21waWxlciBnZW5lcmF0aW5nCi0JICAgICMgMzItYml0IGNvZGUuICBocHBhNjQtaHAtaHB1eCogaGFzIHRoZSBzYW1lIGtlcm5lbCBhbmQgYSBjb21waWxlcgotCSAgICAjIGdlbmVyYXRpbmcgNjQtYml0IGNvZGUuICBHTlUgYW5kIEhQIHVzZSBkaWZmZXJlbnQgbm9tZW5jbGF0dXJlOgotCSAgICAjCi0JICAgICMgJCBDQ19GT1JfQlVJTEQ9Y2MgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhMi4wdy1ocC1ocHV4MTEuMjMKLQkgICAgIyAkIENDX0ZPUl9CVUlMRD0iY2MgK0RBMi4wdyIgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhNjQtaHAtaHB1eDExLjIzCi0KLQkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfAotCQlncmVwIF9fTFA2NF9fID4vZGV2L251bGwKLQkgICAgdGhlbgotCQlIUF9BUkNIPSJocHBhMi4wdyIKLQkgICAgZWxzZQotCQlIUF9BUkNIPSJocHBhNjQiCi0JICAgIGZpCi0JZmkKLQllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQKLQltYWluICgpCi0JewotCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKLQkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0Ci0JICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KLQkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY3B1KQotCQl7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKLQkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7Ci0JICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZXhpdCAoMCk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKLQkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgOzsKLSAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCi0JZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCA7OwotICAgIGhwOD8/Ok9TRjE6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCA7OwotICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKLQllY2hvIGhwcGExLjEtaHAtbGl0ZXMKLQlleGl0IDs7Ci0gICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKLQllY2hvIGMxLWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7Ci0gICAgQ1JBWSpZLU1QOio6KjoqKQotCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqW0EtWl05MDoqOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKLQl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKLQkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCi0JICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqVDNFOio6KjoqKQotCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlNWMToqOio6KikKLQllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICAqOlVOSUNPUy9tcDoqOiopCi0JZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgOzsKLSAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotCWV4aXQgOzsKLSAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgc3BhcmMqOkJTRC9PUzoqOiopCi0JZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgotCSAgICBwYzk4KQotCQllY2hvIGkzODYtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCSAgICBhbWQ2NCkKLQkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCSAgICAqKQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDs7Ci0gICAgaSo6TUlOR1cqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKLQlleGl0IDs7Ci0gICAgaSo6d2luZG93czMyKjoqKQotICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgotCWV4aXQgOzsKLSAgICBpKjpQVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgotCWV4aXQgOzsKLSAgICB4ODY6SW50ZXJpeCo6WzM0NTZdKikKLQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgRU02NFQ6SW50ZXJpeCo6WzM0NTZdKikKLQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKLQllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcwotCWV4aXQgOzsKLSAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKLQkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/Ci0JZWNobyBpNTg2LXBjLWludGVyaXgKLQlleGl0IDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgOzsKLSAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgotCWV4aXQgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDs7Ci0gICAgcHJlcCo6U3VuT1M6NS4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICAqOkdOVToqOiopCi0JIyB0aGUgR05VIHN5c3RlbQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgOzsKLSAgICAqOkdOVS8qOio6KikKLQkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQotCWV4aXQgOzsKLSAgICBpKjg2Ok1pbml4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKLQlleGl0IDs7Ci0gICAgYXJtKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGF2cjMyKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGNyaXM6TGludXg6KjoqKQotCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBjcmlzdjMyOkxpbnV4Oio6KikKLQllY2hvIGNyaXN2MzItYXhpcy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgZnJ2OkxpbnV4Oio6KikKLSAgICAJZWNobyBmcnYtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG0zMnIqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgbTY4KjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG1pcHM6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSN1bmRlZiBDUFUKLQkjdW5kZWYgbWlwcwotCSN1bmRlZiBtaXBzZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzZWwKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCi0JQ1BVPW1pcHMKLQkjZWxzZQotCUNQVT0KLQkjZW5kaWYKLQkjZW5kaWYKLUVPRgotCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKLQkgICAgL15DUFUvewotCQlzOiA6OmcKLQkJcAotCSAgICB9J2AiCi0JdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KLQk7OwotICAgIG1pcHM2NDpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI3VuZGVmIENQVQotCSN1bmRlZiBtaXBzNjQKLQkjdW5kZWYgbWlwczY0ZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzNjRlbAotCSNlbHNlCi0JI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKLQlDUFU9bWlwczY0Ci0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmCi1FT0YKLQlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCi0JICAgIC9eQ1BVL3sKLQkJczogOjpnCi0JCXAKLQkgICAgfSdgIgotCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9Ci0JOzsKLSAgICBvcjMyOkxpbnV4Oio6KikKLQllY2hvIG9yMzItdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcHBjNjQ6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGFscGhhOkxpbnV4Oio6KikKLQljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgotCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKLQkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OwotCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKLQkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OwotCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7Ci0gICAgICAgIGVzYWMKLQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQotCWV4aXQgOzsKLSAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCi0JIyBMb29rIGZvciBDUFUgbGV2ZWwKLQljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgotCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7Ci0JICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgcGFyaXNjNjQ6TGludXg6KjoqIHwgaHBwYTY0OkxpbnV4Oio6KikKLQllY2hvIGhwcGE2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4Ci0JZXhpdCA7OwotICAgIHNoNjQqOkxpbnV4Oio6KikKLSAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICB2YXg6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHg4Nl82NDpMaW51eDoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgaSo4NjpMaW51eDoqOiopCi0JIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KLQkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuIGNkIHRvIHRoZSByb290IGRpcmVjdG9yeSB0byBwcmV2ZW50Ci0JIyBwcm9ibGVtcyB3aXRoIG90aGVyIHByb2dyYW1zIG9yIGRpcmVjdG9yaWVzIGNhbGxlZCBgbGQnIGluIHRoZSBwYXRoLgotCSMgU2V0IExDX0FMTD1DIHRvIGVuc3VyZSBsZCBvdXRwdXRzIG1lc3NhZ2VzIGluIEVuZ2xpc2guCi0JbGRfc3VwcG9ydGVkX3RhcmdldHM9YGNkIC87IExDX0FMTD1DIGxkIC0taGVscCAyPiYxIFwKLQkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgdGFyZ2V0czovIWQKLQkJCQkgICAgcy9bIAldWyAJXSovIC9nCi0JCQkJICAgIHMvLipzdXBwb3J0ZWQgdGFyZ2V0czogKi8vCi0JCQkJICAgIHMvIC4qLy8KLQkJCQkgICAgcCdgCi0gICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfdGFyZ2V0cyIgaW4KLQkgIGVsZjMyLWkzODYpCi0JCVRFTlRBVElWRT0iJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnUiCi0JCTs7Ci0JICBhLm91dC1pMzg2LWxpbnV4KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiCi0JCWV4aXQgOzsKLQkgIGNvZmYtaTM4NikKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIgotCQlleGl0IDs7Ci0JICAiIikKLQkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpIG9yCi0JCSMgb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIgotCQlleGl0IDs7Ci0JZXNhYwotCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0JI2lmZGVmIF9fRUxGX18KLQkjIGlmZGVmIF9fR0xJQkNfXwotCSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0JTElCQz1nbnUKLQkjICBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgIGVuZGlmCi0JIyBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgZW5kaWYKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpIHx8IGRlZmluZWQoX19QR0kpIHx8IGRlZmluZWQoX19TVU5QUk9fQykgfHwgZGVmaW5lZChfX1NVTlBST19DQykKLQlMSUJDPWdudQotCSNlbHNlCi0JTElCQz1nbnVhb3V0Ci0JI2VuZGlmCi0JI2VuZGlmCi0JI2lmZGVmIF9fZGlldGxpYmNfXwotCUxJQkM9ZGlldGxpYmMKLQkjZW5kaWYKLUVPRgotCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKLQkgICAgL15MSUJDL3sKLQkJczogOjpnCi0JCXAKLQkgICAgfSdgIgotCXRlc3QgeCIke0xJQkN9IiAhPSB4ICYmIHsKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IgotCQlleGl0Ci0JfQotCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgeyBlY2hvICIke1RFTlRBVElWRX0iOyBleGl0OyB9Ci0JOzsKLSAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQotCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCi0JIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAotCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDs7Ci0gICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKLSAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgotICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0gICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0gICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgOzsKLSAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKLQlleGl0IDs7Ci0gICAgaSo4NjphdGhlb3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcwotCWV4aXQgOzsKLSAgICBpKjg2OnN5bGxhYmxlOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKLQlleGl0IDs7Ci0gICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LjAqOiopCi0JZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBpKjg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCA7OwotICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCi0JVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KLQlmaQotCWV4aXQgOzsKLSAgICBpKjg2Oio6NTpbNjc4XSopCi0gICAgCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgotCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCi0JICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwotCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKLQkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLQkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCA7OwotICAgIHBjOio6KjoqKQotCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgotICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAotICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpMzg2LgotCWVjaG8gaTM4Ni1wYy1tc2Rvc2RqZ3BwCi0gICAgICAgIGV4aXQgOzsKLSAgICBJbnRlbDpNYWNoOjMqOiopCi0JZWNobyBpMzg2LXBjLW1hY2gzCi0JZXhpdCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDs7Ci0gICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAotCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0Ci0JZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgotCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKLQlmaQotCWV4aXQgOzsKLSAgICBtaW5pKjpDVElYOlNZUyo1OiopCi0JIyAibWluaWZyYW1lIgotCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgotCWV4aXQgOzsKLSAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCi0JZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgotCWV4aXQgOzsKLSAgICBNNjgwPzA6RC1OSVg6NS4zOiopCi0JZWNobyBtNjhrLWRpYWItZG5peAotCWV4aXQgOzsKLSAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQotCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKLSAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKLQlPU19SRUw9JycKLQl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKLQkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NDsgZXhpdDsgfSA7OwotICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuMCo6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCi0JZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgOzsKLSAgICBSTSo6U0lOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgOzsKLSAgICAqOlNJTklYLSo6KjoqKQotCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKLQllbHNlCi0JCWVjaG8gbnMzMmstc25pLXN5c3YKLQlmaQotCWV4aXQgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6KjoqOkZUWCopCi0JIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCi0JZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKLQlleGl0IDs7Ci0gICAgaSo4NjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcwotCWV4aXQgOzsKLSAgICAqOlZPUzoqOiopCi0JIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCi0JZXhpdCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKLQllY2hvIG1pcHMtc29ueS1uZXdzb3M2Ci0JZXhpdCA7OwotICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQotCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZXhpdCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgOzsKLSAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKLQlleGl0IDs7Ci0gICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KLQllY2hvIGk1ODYtcGMtYmVvcwotCWV4aXQgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtNTpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLTY6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpSaGFwc29keToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkRhcndpbjoqOiopCi0JVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KLQljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KLQkgICAgdW5rbm93bikgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKLQlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAotCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KLQkJVU5BTUVfUFJPQ0VTU09SPWkzODYKLQkJVU5BTUVfTUFDSElORT1wYwotCWZpCi0JZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlFOWDoqOjQqKQotCWVjaG8gaTM4Ni1wYy1xbngKLQlleGl0IDs7Ci0gICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKLQllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOk5vblN0b3AtVVg6KjoqKQotCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4Ci0JZXhpdCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgOzsKLSAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlBsYW45Oio6KikKLQkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKLQkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgotCSMgb3BlcmF0aW5nIHN5c3RlbXMuCi0JaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KLQkgICAgVU5BTUVfTUFDSElORT1pMzg2Ci0JZWxzZQotCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45Ci0JZXhpdCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgOzsKLSAgICAqOlRFTkVYOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKLQlleGl0IDs7Ci0gICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLWRlYy10b3BzMjAKLQlleGl0IDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDs7Ci0gICAgKjpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCi0JZXhpdCA7OwotICAgICo6SVRTOio6KikKLQllY2hvIHBkcDEwLXVua25vd24taXRzCi0JZXhpdCA7OwotICAgIFNFSToqOio6U0VJVVgpCi0gICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6RHJhZ29uRmx5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCA7OwotICAgICo6KlZNUzoqOiopCi0gICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKLQkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OwotCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKLQllc2FjIDs7Ci0gICAgKjpYRU5JWDoqOlN5c1YpCi0JZWNobyBpMzg2LXBjLXhlbml4Ci0JZXhpdCA7OwotICAgIGkqODY6c2t5b3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKLQlleGl0IDs7Ci0gICAgaSo4NjpyZG9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcwotCWV4aXQgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKLSAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTmVYVCkKLSNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKLSNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKLSNlbmRpZgotICBpbnQgdmVyc2lvbjsKLSAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOwotICBpZiAodmVyc2lvbiA8IDQpCi0gICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQotI2lmIGRlZmluZWQgKFVNQVhWKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChDTVUpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQotICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChzZXF1ZW50KQotI2lmIGRlZmluZWQgKGkzODYpCi0gIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAobnMzMjAwMCkKLSAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKLSAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKLQotICAgIHVuYW1lKCZ1bik7Ci0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7Ci0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAodmF4KQotIyBpZiAhZGVmaW5lZCAodWx0cml4KQotIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICBpZiBkZWZpbmVkIChCU0QpCi0jICAgaWYgQlNEID09IDQzCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOwotIyAgIGVsc2UKLSMgICAgaWYgQlNEID09IDE5OTAwNgotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7Ci0jICAgIGVsc2UKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgZW5kaWYKLSMgZWxzZQotICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCi0gIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0gIGV4aXQgKDEpOwotfQotRU9GCi0KLSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCi0JeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0KLSMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KLQotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0OyB9Ci0KLSMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKLQotaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KLXRoZW4KLSAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgotICAgIGMxKikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDs7Ci0gICAgYzM0KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGMzOCopCi0JZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGVzYWMKLWZpCi0KLWNhdCA+JjIgPDxFT0YKLSQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKLQotVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKLXRoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKLWRvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQotCi0gIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2NnaS1iaW4vdmlld2N2cy8qY2hlY2tvdXQqL2NvbmZpZy9jb25maWcvY29uZmlnLmd1ZXNzCi1hbmQKLSAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzLypjaGVja291dCovY29uZmlnL2NvbmZpZy9jb25maWcuc3ViCi0KLUlmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQotc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKLXBlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCi1pbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCi0KLWNvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCi0KLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAotCi1ob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCi0KLVVOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9Ci1VTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQotVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQotVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KLUVPRgotCi1leGl0IDEKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvY29uZmlnLmguaW4gYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9jb25maWcuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxNDIxMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHByb3h5c3ZyJyBsaWJyYXJ5ICgtbHByb3h5c3ZyKS4gKi8KLSN1bmRlZiBIQVZFX0xJQlBST1hZU1ZSCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdG9ycXVlJyBsaWJyYXJ5ICgtbHRvcnF1ZSkuICovCi0jdW5kZWYgSEFWRV9MSUJUT1JRVUUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1dGlscycgbGlicmFyeSAoLWx1dGlscykuICovCi0jdW5kZWYgSEFWRV9MSUJVVElMUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cGJzX2lsZi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1BCU19JTEZfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURElOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVEFUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX05BTUUKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGBpbnQnIG9yIGB2b2lkJykuICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbmZpZy5zdWIgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWIwYWEzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxNjE2ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgICBJbmMuCi0KLXRpbWVzdGFtcD0nMjAwNi0wOS0yMCcKLQotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSMgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLQotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgotIwotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUwotICAgICAgICQwIFtPUFRJT05dIEFMSUFTCi0KLUNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1Ci1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7Ci0gICAgLS12ZXJzaW9uIHwgLXYgKQotICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgotICAgICAgIGV4aXQgMSA7OwotCi0gICAgKmxvY2FsKikKLSAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KLSAgICAgICBlY2hvICQxCi0gICAgICAgZXhpdCA7OwotCi0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1jYXNlICQjIGluCi0gMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci0gMSkgOzsKLSAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBsaW51eC11Y2xpYmMqIHwgXAotICB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBcCi0gIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKLSAgICBvcz0tJG1heWJlX29zCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKLSAgICA7OwotICAqKQotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKLSAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KLSAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCi0gICAgZWxzZSBvcz07IGZpCi0gICAgOzsKLWVzYWMKLQotIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCi0jIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbwotIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQotIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCi1jYXNlICRvcyBpbgotCS1zdW4qb3MqKQotCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KLQkJOzsKLQktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAotCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAotCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCi0JLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKLQktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAotCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAotCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNjb3V0KQotCQk7OwotCS13cnMpCi0JCW9zPS12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktY2hvcnVzb3MqKQotCQlvcz0tY2hvcnVzb3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotIAktY2hvcnVzcmRiKQotIAkJb3M9LWNob3J1c3JkYgotCQliYXNpY19tYWNoaW5lPSQxCi0gCQk7OwotCS1oaXV4KikKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQktc2NvNikKLQkJb3M9LXNjbzV2NgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzV2NiopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvKikKLQkJb3M9LXNjbzMuMnYyCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktdWRrKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1pc2MpCi0JCW9zPS1pc2MyLjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1jbGl4KikKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKLQkJOzsKLQktaXNjKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1seW54KikKLQkJb3M9LWx5bnhvcwotCQk7OwotCS1wdHgqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKLQkJOzsKLQktd2luZG93c250KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAotCQk7OwotCS1wc29zKikKLQkJb3M9LXBzb3MKLQkJOzsKLQktbWludCB8IC1taW50WzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KLQkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCTE3NTBhIHwgNTgwIFwKLQl8IGEyOWsgXAotCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKLQl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAotCXwgYW0zM18yLjAgXAotCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAotCXwgYmZpbiBcCi0JfCBjNHggfCBjbGlwcGVyIFwKLQl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCi0JfCBmcjMwIHwgZnJ2IFwKLQl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCi0JfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKLQl8IGlwMmsgfCBpcTIwMDAgXAotCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCi0JfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgXAotCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCi0JfCBtaXBzMTYgXAotCXwgbWlwczY0IHwgbWlwczY0ZWwgXAotCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKLQl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCi0JfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCi0JfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCi0JfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCi0JfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCi0JfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAotCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAotCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKLQl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKLQl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCi0JfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAotCXwgbXQgXAotCXwgbXNwNDMwIFwKLQl8IG5pb3MgfCBuaW9zMiBcCi0JfCBuczE2ayB8IG5zMzJrIFwKLQl8IG9yMzIgXAotCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKLQl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKLQl8IHB5cmFtaWQgXAotCXwgc2NvcmUgXAotCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKLQl8IHNoNjQgfCBzaDY0bGUgXAotCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAotCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKLQl8IHNwdSB8IHN0cm9uZ2FybSBcCi0JfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAotCXwgdjg1MCB8IHY4NTBlIFwKLQl8IHdlMzJrIFwKLQl8IHg4NiB8IHhjMTZ4IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAotCXwgejhrKQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJOzsKLQltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCi0JCSMgTW90b3JvbGEgNjhIQzExLzEyLgotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJb3M9LW5vbmUKLQkJOzsKLQltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKLQkJOzsKLQltczEpCi0JCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgotCQk7OwotCi0JIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKLQkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKLQkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCi0JaSo4NiB8IHg4Nl82NCkKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JNTgwLSogXAotCXwgYTI5ay0qIFwKLQl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAotCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKLQl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAotCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCi0JfCBhdnItKiB8IGF2cjMyLSogXAotCXwgYmZpbi0qIHwgYnMyMDAwLSogXAotCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCi0JfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAotCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAotCXwgZWx4c2ktKiBcCi0JfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCi0JfCBoODMwMC0qIHwgaDg1MDAtKiBcCi0JfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAotCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKLQl8IGlwMmstKiB8IGlxMjAwMC0qIFwKLQl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKLQl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCi0JfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogXAotCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAotCXwgbWlwczE2LSogXAotCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKLQl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAotCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCi0JfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAotCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKLQl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCi0JfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAotCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKLQl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAotCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKLQl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAotCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKLQl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAotCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCi0JfCBtbWl4LSogXAotCXwgbXQtKiBcCi0JfCBtc3A0MzAtKiBcCi0JfCBuaW9zLSogfCBuaW9zMi0qIFwKLQl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3Jpb24tKiBcCi0JfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCi0JfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogXAotCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKLQl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAotCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAotCXwgc3BhcmNsaXRlLSogXAotCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAotCXwgdGFob2UtKiB8IHRodW1iLSogXAotCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAotCXwgdHJvbi0qIFwKLQl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCi0JfCB3ZTMyay0qIFwKLQl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSogXAotCXwgeHN0b3JteTE2LSogfCB4dGVuc2EtKiBcCi0JfCB5bXAtKiBcCi0JfCB6OGstKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotICAgIAlhYmFjdXMpCi0JCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KLQkJOzsKLQlhZG9iZTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKLQkJb3M9LXNjb3V0Ci0JCTs7Ci0JYWxsaWFudCB8IGZ4ODApCi0JCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50Ci0JCTs7Ci0JYWx0b3MgfCBhbHRvczMwNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcwotCQk7OwotCWFtMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQotCQlvcz0tYnNkCi0JCTs7Ci0JYW1kNjQpCi0JCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCi0JCTs7Ci0JYW1kNjQtKikKLQkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXludikKLQkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQotCQlvcz0tdW5pY29zbXAKLQkJOzsKLQljcjE2YykKLQkJYmFzaWNfbWFjaGluZT1jcjE2Yy11bmtub3duCi0JCW9zPS1lbGYKLQkJOzsKLQljcmRzIHwgdW5vcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKLQkJOzsKLQljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCi0JCTs7Ci0JY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKLQkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKLQkJOzsKLQljcngpCi0JCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KLQkJb3M9LWVsZgotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczEwCi0JCTs7Ci0JZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczIwCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRqZ3BwKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJb3M9LW1zZG9zZGpncHAKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJOzsKLSMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWkqODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaSo4NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWkqODZ2KQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YKLQkJOzsKLQlpKjg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWkzODZtYWNoKQotCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAotCQlvcz0tbWFjaAotCQk7OwotCWkzODYtdnN0YSB8IHZzdGEpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS12c3RhCi0JCTs7Ci0JaXJpcyB8IGlyaXM0ZCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQotCQljYXNlICRvcyBpbgotCQkgICAgLWlyaXgqKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0taXJpeDQKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQlpc2k2OCB8IGlzaSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQotCQlvcz0tc3lzdgotCQk7OwotCW04OGstb21yb24qKQotCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KLQkJOzsKLQltYWdudW0gfCBtMzIzMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJb3M9LXN5c3YKLQkJOzsKLQltZXJsaW4pCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawotCQlvcz0tc3lzdgotCQk7OwotCW1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCW1pbmlmcmFtZSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAotCQk7OwotCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltb25pdG9yKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JbW9ycGhvcykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJb3M9LW1vcnBob3MKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1tc2RvcwotCQk7OwotCW1zMS0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5vbnN0b3B1eCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQotCQlvcz0tbm9uc3RvcHV4Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW5zci10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlvcGVucmlzYyB8IG9wZW5yaXNjLSopCi0JCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCi0JCTs7Ci0Jb3M0MDApCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KLQkJb3M9LW9zNDAwCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotCXBjNTMyIHwgcGM1MzItKikKLQkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgotCQk7OwotCXBjOTgpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQk7OwotCXBjOTgtKikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJOzsKLQlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtNCkKLQkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW00LSopCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBuKQotCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCi0JCTs7Ci0JcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCi0JCTs7Ci0JcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQk7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCQk7OwotCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KLQkJOzsKLQlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgotCQk7OwotCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0JcHczMikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KLQkJb3M9LXB3MzIKLQkJOzsKLQlyZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LXJkb3MKLQkJOzsKLQlyb202OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQlybVs0Nl0wMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKLQkJOzsKLQlydHBjIHwgcnRwYy0qKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JczM5MCB8IHMzOTAtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQotCQk7OwotCXMzOTB4IHwgczM5MHgtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzYjEpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KLQkJOzsKLQlzYjFlbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCi0JCTs7Ci0Jc2RlKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKLQkJb3M9LWVsZgotCQk7OwotCXNlaSkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQotCQlvcz0tc2VpdXgKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0aWM1NHggfCBjNTR4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXRpYzU1eCB8IGM1NXgqKQotCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdGljNnggfCBjNngqKQotCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0eDM5KQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KLQkJOzsKLQl0eDM5ZWwpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCi0JCTs7Ci0JdG9hZDEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCi0JCW9zPS10b3BzMjAKLQkJOzsKLQl0b3dlciB8IHRvd2VyLTMyKQotCQliYXNpY19tYWNoaW5lPW02OGstbmNyCi0JCTs7Ci0JdHBmKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQlvcz0tdHBmCi0JCTs7Ci0JdWRpMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQl1bHRyYTMpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKLQkJb3M9LXN5bTEKLQkJOzsKLQl2ODEwIHwgbmVjdjgxMCkKLQkJYmFzaWNfbWFjaGluZT12ODEwLW5lYwotCQlvcz0tbm9uZQotCQk7OwotCXZheHYpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tc3lzdgotCQk7OwotCXZtcykKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS12bXMKLQkJOzsKLQl2cHAqfHZ4fHZ4LSopCi0JCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0JCTs7Ci0Jdnh3b3Jrczk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3M2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3MyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl3NjUqKQotCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKLQkJb3M9LW5vbmUKLQkJOzsKLQl3ODlrLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQl4Ym94KQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQl4cHMgfCB4cHMxMDApCi0JCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAotCQk7OwotCXltcCkKLQkJYmFzaWNfbWFjaGluZT15bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JejhrLSotY29mZikKLQkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgotCQlvcz0tc2ltCi0JCTs7Ci0Jbm9uZSkKLQkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKLQkJb3M9LW5vbmUKLQkJOzsKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgotIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgotCXc4OWspCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCTs7Ci0Jb3A1MG4pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlvcDYwYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCXJvbXApCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQltbWl4KQotCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKLQkJOzsKLQlyczYwMDApCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXZheCkKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCTs7Ci0JcGRwMTApCi0JCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCi0JCTs7Ci0JcGRwMTEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCi0JCTs7Ci0Jd2UzMmspCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0Jc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQotCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KLQkJOzsKLQlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLQljeWRyYSkKLQkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCi0JCTs7Ci0Jb3Jpb24pCi0JCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCi0JCTs7Ci0Jb3Jpb24xMDUpCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKLQkJOzsKLQltYWMgfCBtcHcgfCBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJOzsKLQlwbWFjIHwgcG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQotCQk7OwotCSotdW5rbm93bikKLQkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KLQkJOzsKLQkqKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLSMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotZGlnaXRhbCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAotCQk7OwotCSotY29tbW9kb3JlKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKLQkJOzsKLQkqKQotCQk7OwotZXNhYwotCi0jIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotaWYgWyB4IiRvcyIgIT0geCIiIF0KLXRoZW4KLWNhc2UgJG9zIGluCi0gICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0gICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCi0JIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCi0JLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKLQkJOzsKLQktc29sYXJpcykKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JLXN2cjQqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdW5peHdhcmUqKQotCQlvcz0tc3lzdjQuMnV3Ci0JCTs7Ci0JLWdudS9saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KLQkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgotCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgotCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKLQkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCi0JICAgICAgfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCi0JICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKLQkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKLQkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1uZXdsaWIqIHwgLWxpbnV4LXVjbGliYyogXAotCSAgICAgIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKLQkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAotCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAotCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAotCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKLQkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKLQkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAotCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyogfCAtdG9wcGVycyopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8tcW54KikKLQkJOzsKLQktbnRvKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCi0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4LWRpZXRsaWJjKQotCQlvcz0tbGludXgtZGlldGxpYmMKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vcGVuZWQqKQotCQlvcz0tb3BlbmVkaXRpb24KLQkJOzsKLSAgICAgICAgLW9zNDAwKikKLQkJb3M9LW9zNDAwCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLXN5bGxhYmxlKikKLQkJb3M9LXN5bGxhYmxlCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCQlvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JLW5zayopCi0JCW9zPS1uc2sKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotICAgICAgICAtdHBmKikKLQkJb3M9LXRwZgotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JLWFyb3MqKQotCQlvcz0tYXJvcwotCQk7OwotCS1rYW9zKikKLQkJb3M9LWthb3MKLQkJOzsKLQktenZtb2UpCi0JCW9zPS16dm1vZQotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0gICAgICAgIHNjb3JlLSopCi0JCW9zPS1lbGYKLQkJOzsKLSAgICAgICAgc3B1LSopCi0JCW9zPS1lbGYKLQkJOzsKLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotICAgICAgICBjNHgtKiB8IHRpYzR4LSopCi0gICAgICAgIAlvcz0tY29mZgotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KLQlwZHAxMC0qKQotCQlvcz0tdG9wczIwCi0JCTs7Ci0JcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCW02OCotY2lzY28pCi0JCW9zPS1hb3V0Ci0JCTs7Ci0JbWlwcyotY2lzY28pCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi0qKQotCQlvcz0tZWxmCi0JCTs7Ci0Jb3IzMi0qKQotCQlvcz0tY29mZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaGFpa3UpCi0JCW9zPS1oYWlrdQotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0gICAgCSota251dGgpCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCSotd2VjKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi13aW5ib25kKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1va2kpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQkqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotCSotaGlnaGxldmVsKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1lbmNvcmUpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLQkqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKiB8IC1vcGVuZWQqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLW9zNDAwKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS10cGYqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKLQkJCQl2ZW5kb3I9d3JzCi0JCQkJOzsKLQkJCS1hdXgqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktaG1zKikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktbXB3KiB8IC1tYWNvcyopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCQkJdmVuZG9yPWF0YXJpCi0JCQkJOzsKLQkJCS12b3MqKQotCQkJCXZlbmRvcj1zdHJhdHVzCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCi1leGl0Ci0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbmZpZ3VyZSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNmNjg5MS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MTI3ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxIGZvciBvcmcuZWNsaXBzZS5wdHAucGJzIDMuMC4wLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCi0jIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLQotCi0jIFBBVEggbmVlZHMgQ1IKLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKLSAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAotICBjaG1vZCAreCBjb25mJCQuc2gKLSAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgZWxzZQotICAgIFBBVEhfU0VQQVJBVE9SPToKLSAgZmkKLSAgcm0gLWYgY29uZiQkLnNoCi1maQotCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1hc19ubD0nCi0nCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1jYXNlICQwIGluCi0gICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKLSAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICBlY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCi1mb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICi1kbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1mb3IgYXNfdmFyIGluIFwKLSAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKLSAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKLSAgTENfVEVMRVBIT05FIExDX1RJTUUKLWRvCi0gIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCi0gICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gIGVsc2UKLSAgICAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICBmaQotZG9uZQotCi0jIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotCi0jIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBDRFBBVEguCi0kYXNfdW5zZXQgQ0RQQVRICi0KLQotaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgotICBpZiAoZXZhbCAiOiIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi1lbHNlCi0gIGFzX2hhdmVfcmVxdWlyZWQ9bm8KLWZpCi0KLSAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IHllcyAmJiAJIChldmFsICI6Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9XCRMSU5FTk8KLSAgYXNfbGluZW5vXzI9XCRMSU5FTk8KLSAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCi0gIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEgKyAxXGBcIiA9IFwieFwkYXNfbGluZW5vXzJcIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0iKSAyPiAvZGV2L251bGw7IHRoZW4KLSAgOgotZWxzZQotICBhc19jYW5kaWRhdGVfc2hlbGxzPQotICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgY2FzZSAkYXNfZGlyIGluCi0JIC8qKQotCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KLQkgICAgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9IiRhc19jYW5kaWRhdGVfc2hlbGxzICRhc19kaXIvJGFzX2Jhc2UiCi0JICAgZG9uZTs7Ci0gICAgICAgZXNhYwotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLSAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCi0JICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KLQkgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCi0JCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLV9BU0VPRgotfTsgdGhlbgotICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsCi0JICAgICAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi0JICAgICAgIGlmIHsgIiRhc19zaGVsbCIgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLWVzYWMKLQotZmkKLQotCi06Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCAkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9ICIkMSIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0ICRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotCi0oCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLV9BU0VPRgotfTsgdGhlbgotICBicmVhawotZmkKLQotZmkKLQotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgotICBmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOVgotICAgICAgICBkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICAgICAgICBkb25lCi0gICAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQotZmkKLQotCi0gICAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IG5vOyB0aGVuCi0gIGVjaG8gVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCB0aGUKLSAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKLSAgICAgIGVjaG8gbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4gdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEKLSAgICAgIGVjaG8gc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLgotICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0KLWZpCi0KLWZpCi0KLQotCi0oZXZhbCAiYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCIpIHx8IHsKLSAgZWNobyBObyBzaGVsbCBmb3VuZCB0aGF0IHN1cHBvcnRzIHNoZWxsIGZ1bmN0aW9ucy4KLSAgZWNobyBQbGVhc2UgdGVsbCBhdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAotICBlY2hvIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCi0gIGVjaG8gbWVzc2FnZQotfQotCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgewotCi0gICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KLSAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQotICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKLSAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKLSAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcwotICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCi0gICMgY2FzZSBhdCBsaW5lIGVuZC4KLSAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCi0gICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQotICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQotICBzZWQgLW4gJwotICAgIHAKLSAgICAvWyRdTElORU5PLz0KLSAgJyA8JGFzX215c2VsZiB8Ci0gICAgc2VkICcKLSAgICAgIHMvWyRdTElORU5PLiovJi0vCi0gICAgICB0IGxpbmVubwotICAgICAgYgotICAgICAgOmxpbmVubwotICAgICAgTgotICAgICAgOmxvb3AKLSAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwotICAgICAgdCBsb29wCi0gICAgICBzLy1cbi4qLy8KLSAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLSAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0gICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCi0gIC4gIi4vJGFzX21lLmxpbmVubyIKLSAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0gIGV4aXQKLX0KLQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3hcYydgIGluCi0gICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICAqKSAgIEVDSE9fQz0nXGMnOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLWlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgotICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCi1lbHNlCi0gIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpcgotZmkKLWVjaG8gPmNvbmYkJC5maWxlCi1pZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz0nbG4gLXMnCi0gICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgotICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgYXNfbG5fcz0nY3AgLXAnCi1lbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPWxuCi1lbHNlCi0gIGFzX2xuX3M9J2NwIC1wJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPToKLWVsc2UKLSAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSAgYXNfbWtkaXJfcD1mYWxzZQotZmkKLQotaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc190ZXN0X3g9J3Rlc3QgLXgnCi1lbHNlCi0gIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGFzX2xzX0xfb3B0aW9uPUwKLSAgZWxzZQotICAgIGFzX2xzX0xfb3B0aW9uPQotICBmaQotICBhc190ZXN0X3g9JwotICAgIGV2YWwgc2ggLWMgJ1wnJwotICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCi0gICAgICAgIHRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4KLSAgICAgICAgLSopc2V0ICIuLyQxIjs7Ci0JZXNhYzsKLQljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi1hc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLWFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLQotCi1leGVjIDc8JjAgPC9kZXYvbnVsbCA2PiYxCi0KLSMgTmFtZSBvZiB0aGUgaG9zdC4KLSMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCi0jIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KLWFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotCi0jCi0jIEluaXRpYWxpemF0aW9ucy4KLSMKLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLWFjX2NsZWFuX2ZpbGVzPQotYWNfY29uZmlnX2xpYm9ial9kaXI9LgotTElCT0JKUz0KLWNyb3NzX2NvbXBpbGluZz1ubwotc3ViZGlycz0KLU1GTEFHUz0KLU1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLSMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotUEFDS0FHRV9OQU1FPSdvcmcuZWNsaXBzZS5wdHAucGJzJwotUEFDS0FHRV9UQVJOQU1FPSdvcmctZWNsaXBzZS1wdHAtcGJzJwotUEFDS0FHRV9WRVJTSU9OPSczLjAuMCcKLVBBQ0tBR0VfU1RSSU5HPSdvcmcuZWNsaXBzZS5wdHAucGJzIDMuMC4wJwotUEFDS0FHRV9CVUdSRVBPUlQ9JycKLQotYWNfdW5pcXVlX2ZpbGU9InNyYy9wdHBfcGJzX3Byb3h5LmMiCi0jIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCi1hY19pbmNsdWRlc19kZWZhdWx0PSJcCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBTVERDX0hFQURFUlMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9TVERMSUJfSAotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKLSMgIGluY2x1ZGUgPG1lbW9yeS5oPgotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERJTlRfSAotIyBpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYiCi0KLWFjX3N1YnN0X3ZhcnM9J1NIRUxMCi1QQVRIX1NFUEFSQVRPUgotUEFDS0FHRV9OQU1FCi1QQUNLQUdFX1RBUk5BTUUKLVBBQ0tBR0VfVkVSU0lPTgotUEFDS0FHRV9TVFJJTkcKLVBBQ0tBR0VfQlVHUkVQT1JUCi1leGVjX3ByZWZpeAotcHJlZml4Ci1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1iaW5kaXIKLXNiaW5kaXIKLWxpYmV4ZWNkaXIKLWRhdGFyb290ZGlyCi1kYXRhZGlyCi1zeXNjb25mZGlyCi1zaGFyZWRzdGF0ZWRpcgotbG9jYWxzdGF0ZWRpcgotaW5jbHVkZWRpcgotb2xkaW5jbHVkZWRpcgotZG9jZGlyCi1pbmZvZGlyCi1odG1sZGlyCi1kdmlkaXIKLXBkZmRpcgotcHNkaXIKLWxpYmRpcgotbG9jYWxlZGlyCi1tYW5kaXIKLURFRlMKLUVDSE9fQwotRUNIT19OCi1FQ0hPX1QKLUxJQlMKLWJ1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUlOU1RBTExfUFJPR1JBTQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfREFUQQotYW1fX2lzcmMKLUNZR1BBVEhfVwotUEFDS0FHRQotVkVSU0lPTgotQUNMT0NBTAotQVVUT0NPTkYKLUFVVE9NQUtFCi1BVVRPSEVBREVSCi1NQUtFSU5GTwotaW5zdGFsbF9zaAotU1RSSVAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotbWtkaXJfcAotQVdLCi1TRVRfTUFLRQotYW1fX2xlYWRpbmdfZG90Ci1BTVRBUgotYW1fX3RhcgotYW1fX3VudGFyCi1idWlsZAotYnVpbGRfY3B1Ci1idWlsZF92ZW5kb3IKLWJ1aWxkX29zCi1QQlNESVIKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUNQUEZMQUdTCi1hY19jdF9DQwotRVhFRVhUCi1PQkpFWFQKLURFUERJUgotYW1fX2luY2x1ZGUKLWFtX19xdW90ZQotQU1ERVBfVFJVRQotQU1ERVBfRkFMU0UKLUFNREVQQkFDS1NMQVNICi1DQ0RFUE1PREUKLWFtX19mYXN0ZGVwQ0NfVFJVRQotYW1fX2Zhc3RkZXBDQ19GQUxTRQotUkFOTElCCi1DUFAKLUdSRVAKLUVHUkVQCi1MSUJPQkpTCi1MVExJQk9CSlMnCi1hY19zdWJzdF9maWxlcz0nJwotICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKLWhvc3RfYWxpYXMKLXRhcmdldF9hbGlhcwotQ0MKLUNGTEFHUwotTERGTEFHUwotTElCUwotQ1BQRkxBR1MKLUNQUCcKLQotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi1hY19pbml0X2hlbHA9Ci1hY19pbml0X3ZlcnNpb249ZmFsc2UKLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1jYWNoZV9maWxlPS9kZXYvbnVsbAotZXhlY19wcmVmaXg9Tk9ORQotbm9fY3JlYXRlPQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotCi0jIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KLSMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgotIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKLSMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KLSMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCi0jIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKLWRhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9JwotaW5mb2Rpcj0nJHtkYXRhcm9vdGRpcn0vaW5mbycKLWh0bWxkaXI9JyR7ZG9jZGlyfScKLWR2aWRpcj0nJHtkb2NkaXJ9JwotcGRmZGlyPScke2RvY2Rpcn0nCi1wc2Rpcj0nJHtkb2NkaXJ9JwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1sb2NhbGVkaXI9JyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZScKLW1hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJwotCi1hY19wcmV2PQotYWNfZGFzaGRhc2g9Ci1mb3IgYWNfb3B0aW9uCi1kbwotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAkYWNfcHJldj1cJGFjX29wdGlvbgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICRhY19vcHRpb24gaW4KLSAgKj0qKQlhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OwotICAqKQlhY19vcHRhcmc9eWVzIDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgotICAtLSkKLSAgICBhY19kYXNoZGFzaD15ZXMgOzsKLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSRhY19vcHRhcmcgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OwotCi0gIC0tY29uZmlnLWNhY2hlIHwgLUMpCi0gICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKLSAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKLSAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCi0gICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OwotICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCi0gIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQotICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPVwkYWNfb3B0YXJnIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCi0gICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKLSAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQotICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKLSAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQotICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQotICAgIGFjX3ByZXY9aHRtbGRpciA7OwotICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKLSAgfCAtLWh0PSopCi0gICAgaHRtbGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKLSAgICBhY19wcmV2PWxvY2FsZWRpciA7OwotICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQotICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7Ci0KLSAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKLSAgICBhY19wcmV2PXBkZmRpciA7OwotICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQotICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKLSAgICBhY19wcmV2PXBzZGlyIDs7Ci0gIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQotICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCi0gICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCB3aXRoXyRhY19wYWNrYWdlPVwkYWNfb3B0YXJnIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1ubyA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgOzsKLQotICAqPSopCi0gICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKLSAgICBleHBvcnQgJGFjX2VudnZhciA7OwotCi0gICopCi0gICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgotICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCi0gICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259Ci0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgotZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0JCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAotCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCi0JCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKLSAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7Ci0gIGVzYWMKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZG9uZQotCi0jIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCi0jIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KLSMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLWJ1aWxkPSRidWlsZF9hbGlhcwotaG9zdD0kaG9zdF9hbGlhcwotdGFyZ2V0PSR0YXJnZXRfYWxpYXMKLQotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotaWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCi0gIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQotICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KLSAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZC4iID4mMgotICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPXllcwotICBmaQotZmkKLQotYWNfdG9vbF9wcmVmaXg9Ci10ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCi0KLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKLQotCi1hY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKLWFjX2xzX2RpPWBscyAtZGkgLmAgJiYKLWFjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IFdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotdGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8Ci0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogcHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWCIkMCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJDAiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllcyAmJiBzcmNkaXI9IiRhY19jb25mZGlyIG9yIC4uIgotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgeyBlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfbXNnIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCXB3ZClgCi0jIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgotaWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgotICBzcmNkaXI9LgotZmkKLSMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCi0jIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KLSMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgotY2FzZSAkc3JjZGlyIGluCi0qLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKLWVzYWMKLWZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0gIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Ci0gIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Ci1kb25lCi0KLSMKLSMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KLSMKLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCi0gICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gIGNhdCA8PF9BQ0VPRgotXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgb3JnLmVjbGlwc2UucHRwLnBicyAzLjAuMCB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCi0KLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgotCi1UbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCi1WQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgotCi1EZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KLQotQ29uZmlndXJhdGlvbjoKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQotICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKLSAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCi0gIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCi0gIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotCQkJICBbUFJFRklYXQotCi1CeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KLVxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5Ci1hbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAotZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KLQotRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCi0KLUZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCi0gIC0tZGF0YXJvb3RkaXI9RElSICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQotICAtLWxvY2FsZWRpcj1ESVIgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCi0gIC0tZG9jZGlyPURJUiAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2Mvb3JnLWVjbGlwc2UtcHRwLXBic10KLSAgLS1odG1sZGlyPURJUiAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcHNkaXI9RElSICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotX0FDRU9GCi0KLSAgY2F0IDw8XF9BQ0VPRgotCi1Qcm9ncmFtIG5hbWVzOgotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi1fQUNFT0YKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCi0gIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2Ygb3JnLmVjbGlwc2UucHRwLnBicyAzLjAuMDoiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnMKLQotT3B0aW9uYWwgUGFja2FnZXM6Ci0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0td2l0aC1wYnMgICAgICAgICAgICAgIFNwZWNpZnkgdGhlIHRvcCBkaXIgb2YgaW5zdGFsbGVkIFBCUyBybXMuW1JFUVVJUkVEXQotCi1Tb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCi0gIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKLSAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCi0gICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KLSAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgotICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCi0gICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgotICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1fQUNFT0YKLWFjX3N0YXR1cz0kPwotZmkKLQotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgotICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgotICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQotICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8IGNvbnRpbnVlCi0gICAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKLSAgICBmaSB8fCBhY19zdGF0dXM9JD8KLSAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Ci0gIGRvbmUKLWZpCi0KLXRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwotaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgotICBjYXQgPDxcX0FDRU9GCi1vcmcuZWNsaXBzZS5wdHAucGJzIGNvbmZpZ3VyZSAzLjAuMAotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotX0FDRU9GCi0gIGV4aXQKLWZpCi1jYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotCi1JdCB3YXMgY3JlYXRlZCBieSBvcmcuZWNsaXBzZS5wdHAucGJzICRhc19tZSAzLjAuMCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICAkICQwICRACi0KLV9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci1jYXQgPDxfQVNVTkFNRQotIyMgLS0tLS0tLS0tICMjCi0jIyBQbGF0Zm9ybS4gIyMKLSMjIC0tLS0tLS0tLSAjIwotCi1ob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCi0KLS9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotX0FTVU5BTUUKLQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBlY2hvICJQQVRIOiAkYXNfZGlyIgotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi19ID4mNQotCi1jYXQgPiY1IDw8X0FDRU9GCi0KLQotIyMgLS0tLS0tLS0tLS0gIyMKLSMjIENvcmUgdGVzdHMuICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotCi1fQUNFT0YKLQotCi0jIEtlZXAgYSB0cmFjZSBvZiB0aGUgY29tbWFuZCBsaW5lLgotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIFN0cmlwIG91dCAtLXNpbGVudCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb3JkIGl0IGZvciBmdXR1cmUgcnVucy4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGEtY2hhcmFjdGVycy4KLSMgTWFrZSB0d28gcGFzc2VzIHRvIGFsbG93IGZvciBwcm9wZXIgZHVwbGljYXRlLWFyZ3VtZW50IHN1cHByZXNzaW9uLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1hY19jb25maWd1cmVfYXJnczA9Ci1hY19jb25maWd1cmVfYXJnczE9Ci1hY19tdXN0X2tlZXBfbmV4dD1mYWxzZQotZm9yIGFjX3Bhc3MgaW4gMSAyCi1kbwotICBmb3IgYWNfYXJnCi0gIGRvCi0gICAgY2FzZSAkYWNfYXJnIGluCi0gICAgLW5vLWNyZWF0ZSB8IC0tbm8tYyogfCAtbiB8IC1uby1yZWN1cnNpb24gfCAtLW5vLXIqKSBjb250aW51ZSA7OwotICAgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgICBjb250aW51ZSA7OwotICAgICpcJyopCi0gICAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgJGFjX3Bhc3MgaW4KLSAgICAxKSBhY19jb25maWd1cmVfYXJnczA9IiRhY19jb25maWd1cmVfYXJnczAgJyRhY19hcmcnIiA7OwotICAgIDIpCi0gICAgICBhY19jb25maWd1cmVfYXJnczE9IiRhY19jb25maWd1cmVfYXJnczEgJyRhY19hcmcnIgotICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCi0JYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgotICAgICAgZWxzZQotCWNhc2UgJGFjX2FyZyBpbgotCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCi0JICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCi0JICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCi0JICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKLQkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCi0JICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLWRvbmUKLSRhc191bnNldCBhY19jb25maWd1cmVfYXJnczAgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczArc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MwPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMDsgfQotJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMSB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMStzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczE9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MxOyB9Ci0KLSMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKLSMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCi0jIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KLSMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgotIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgotdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCi0gIHsKLSAgICBlY2hvCi0KLSAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBDYWNoZSB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICBlY2hvCi0gICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSgKLSAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbwotICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotICAgICoke2FzX25sfSopCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgICpfY3ZfKikgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjI7fSA7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0gICAgICAqKSAkYXNfdW5zZXQgJGFjX3ZhciA7OwotICAgICAgZXNhYyA7OwotICAgIGVzYWMKLSAgZG9uZQotICAoc2V0KSAyPiYxIHwKLSAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9J1wnJyAnXCcnOyBzZXQpIDI+JjFgIGluICMoCi0gICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQotICAgICAgc2VkIC1uIFwKLQkicy8nXCcnLydcJydcXFxcJ1wnJydcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1wnJ1xcMidcJycvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCi0gICAgICA7OwotICAgIGVzYWMgfAotICAgIHNvcnQKLSkKLSAgICBlY2hvCi0KLSAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICBlY2hvCi0gICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycwotICAgIGRvCi0gICAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICAgIGNhc2UgJGFjX3ZhbCBpbgotICAgICAgKlwnXCcnKikgYWNfdmFsPWBlY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Ci0gICAgICBlc2FjCi0gICAgICBlY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICBkb25lIHwgc29ydAotICAgIGVjaG8KLQotICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KLSAgICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIEZpbGUgc3Vic3RpdHV0aW9ucy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAotICAgICAgZWNobwotICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKLSAgICAgIGRvCi0JZXZhbCBhY192YWw9XCQkYWNfdmFyCi0JY2FzZSAkYWNfdmFsIGluCi0JKlwnXCcnKikgYWNfdmFsPWBlY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Ci0JZXNhYwotCWVjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgotICAgICAgZG9uZSB8IHNvcnQKLSAgICAgIGVjaG8KLSAgICBmaQotCi0gICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLSAjIwotIyMgY29uZmRlZnMuaC4gIyMKLSMjIC0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGNhdCBjb25mZGVmcy5oCi0gICAgICBlY2hvCi0gICAgZmkKLSAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCi0gICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKLSAgICBlY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgotICB9ID4mNQotICBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogJiYKLSAgICBybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCi0gICAgZXhpdCAkZXhpdF9zdGF0dXMKLScgMAotZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCi0gIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAotZG9uZQotYWNfc2lnbmFsPTAKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0KLSMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCi1fQUNFT0YKLQotCi0jIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIHNldCB4ICIkQ09ORklHX1NJVEUiCi1lbGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICBzZXQgeCAiJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgIiRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotZWxzZQotICBzZXQgeCAiJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlIiBcCi0JIiRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi1maQotc2hpZnQKLWZvciBhY19zaXRlX2ZpbGUKLWRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQotICAgIHNlZCAncy9eL3wgLycgIiRhY19zaXRlX2ZpbGUiID4mNQotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbAotICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KLSAgaWYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gICAgY2FzZSAkY2FjaGVfZmlsZSBpbgotICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OwotICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OwotICAgIGVzYWMKLSAgZmkKLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgPiRjYWNoZV9maWxlCi1maQotCi0jIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCi0jIHZhbHVlLgotYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCi1mb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwotICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAotICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAotICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgotICAgIHNldCwpCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICxzZXQpCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLCk7OwotICAgICopCi0gICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjUKLWVjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiYyO30KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjUKLWVjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiYyO30KLQlhY19jYWNoZV9jb3JydXB0ZWQ9OgotICAgICAgZmk7OwotICBlc2FjCi0gICMgUGFzcyBwcmVjaW91cyB2YXJpYWJsZXMgdG8gY29uZmlnLnN0YXR1cy4KLSAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCi0gICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgotICAgICpcJyopIGFjX2FyZz0kYWNfdmFyPWBlY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OwotICAgIGVzYWMKLSAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KLSAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgotICAgICAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICAgZXNhYwotICBmaQotZG9uZQotaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotCi0KLWFtX19hcGlfdmVyc2lvbj0nMS4xMCcKLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCi0gIGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC1zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLSMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAotIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgotIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5Ci0jIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLWNhc2UgJGFzX2Rpci8gaW4KLSAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKLSAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCi0gID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAotICAvdXNyL3VjYi8qICkgOzsKLSAgKikKLSAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICMgYnkgZGVmYXVsdC4KLSAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKLQkgICAgYnJlYWsgMwotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjY7IH0KLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICRFQ0hPX0MiID4mNjsgfQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSMgQnkgZGVmYXVsdCB3YXMgYHMseCx4JywgcmVtb3ZlIGl0IGlmIHVzZWxlc3MuCi1jYXQgPDxcX0FDRU9GID5jb25mdGVzdC5zZWQKLXMvW1xcJF0vJiYvZztzLztzLHgseCwkLy8KLV9BQ0VPRgotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB8IHNlZCAtZiBjb25mdGVzdC5zZWRgCi1ybSAtZiBjb25mdGVzdC5zZWQKLQotIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAotYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotCi10ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKLSMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAotaWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KLSAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKLWVsc2UKLSAgYW1fbWlzc2luZ19ydW49Ci0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiYyO30KLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX3Byb2cgaW4gbWtkaXIgZ21rZGlyOyBkbwotCSBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQkgICB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9IHx8IGNvbnRpbnVlCi0JICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAotCSAgICAgJ21rZGlyIChHTlUgY29yZXV0aWxzKSAnKiB8IFwKLQkgICAgICdta2RpciAoY29yZXV0aWxzKSAnKiB8IFwKLQkgICAgICdta2RpciAoZmlsZXV0aWxzKSAnNC4xKikKLQkgICAgICAgYWNfY3ZfcGF0aF9ta2Rpcj0kYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0Ci0JICAgICAgIGJyZWFrIDM7OwotCSAgIGVzYWMKLQkgZG9uZQotICAgICAgIGRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBNS0RJUl9QPSIkYWNfY3ZfcGF0aF9ta2RpciAtcCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBNS0RJUl9QIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgotICAgIE1LRElSX1A9IiRhY19pbnN0YWxsX3NoIC1kIgotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJE1LRElSX1AiID4mNQotZWNobyAiJHtFQ0hPX1R9JE1LRElSX1AiID4mNjsgfQotCi1ta2Rpcl9wPSIkTUtESVJfUCIKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qKSA7OwotICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Ci1lc2FjCi0KLWZvciBhY19wcm9nIGluIGdhd2sgbWF3ayBuYXdrIGF3awotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BV0src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQVdLPSIkYWNfcHJvZyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFXSz0kYWNfY3ZfcHJvZ19BV0sKLWlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFXSyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQVdLIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKLWRvbmUKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1zZXQgeCAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiB7IGFzX3Zhcj1hY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgotU0hFTEwgPSAvYmluL3NoCi1hbGw6Ci0JQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKLV9BQ0VPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1jYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KLSAgKkBAQCUlJT0/Kj1AQEAlJSUqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7Ci0gICopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OwotZXNhYwotcm0gLWYgY29uZnRlc3QubWFrZQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotICBTRVRfTUFLRT0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLXJtIC1yZiAudHN0IDI+L2Rldi9udWxsCi1ta2RpciAudHN0IDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC50c3Q7IHRoZW4KLSAgYW1fX2xlYWRpbmdfZG90PS4KLWVsc2UKLSAgYW1fX2xlYWRpbmdfZG90PV8KLWZpCi1ybWRpciAudHN0IDI+L2Rldi9udWxsCi0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KLSAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKLSAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgotICBhbV9faXNyYz0nIC1JJChzcmNkaXIpJwotICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLSAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICBmaQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi0gUEFDS0FHRT0nb3JnLWVjbGlwc2UtcHRwLXBicycKLSBWRVJTSU9OPSczLjAuMCcKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLV9BQ0VPRgotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi0KLUFDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KLQotCi1BVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9Ci0KLQotTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9Ci0KLWluc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci0KLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBTVFJJUD0kYWNfY3RfU1RSSVAKLSAgZmkKLWVsc2UKLSAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotZmkKLQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi0KLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi1BTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9Ci0KLWFtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJwotCi0KLQotCi0KLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1hY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2J1aWxkIiA+JjY7IH0KLWNhc2UgJGFjX2N2X2J1aWxkIGluCi0qLSotKikgOzsKLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLWVzYWMKLWJ1aWxkPSRhY19jdl9idWlsZAotYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwotc2V0IHggJGFjX2N2X2J1aWxkCi1zaGlmdAotYnVpbGRfY3B1PSQxCi1idWlsZF92ZW5kb3I9JDIKLXNoaWZ0OyBzaGlmdAotIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCi0jIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Ci1idWlsZF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi0KLQotVVRJTFM9Ii4uL29yZy5lY2xpcHNlLnB0cC51dGlscyIKLWlmIHRlc3QgISAtZCAkVVRJTFM7IHRoZW4KLQlVVElMUz0iYGVjaG8gJHtVVElMU31fJHtQQUNLQUdFX1ZFUlNJT059LipgIgotCWlmIHRlc3QgISAtZCAkVVRJTFM7IHRoZW4KLQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdXRpbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiB1dGlscyBkaXJlY3Rvcnkgbm90IGZvdW5kIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JZmkKLWZpCi0KLVBST1hZPSIuLi9vcmcuZWNsaXBzZS5wdHAucHJveHkiCi1pZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JUFJPWFk9ImBlY2hvICR7UFJPWFl9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHByb3h5IGRpcmVjdG9yeSBub3QgZm91bmQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcHJveHkgZGlyZWN0b3J5IG5vdCBmb3VuZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCWZpCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wYnMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3BicytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSR3aXRoX3BiczsKLWVsc2UKLSAgd2l0aF9wYnM9bm8KLWZpCi0KLQotUEJTRElSPQotaWYgdGVzdCAieCR3aXRoX3BicyIgIT0geG5vOyB0aGVuCi0gIFBCU0RJUj0kd2l0aF9wYnMKLQotZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBUaGUgdG9wIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgUEJTIG11c3QgYmUgc3BlY2lmaWVkIHZpYSBcIi0td2l0aC1wYnM9RElSXCIuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFRoZSB0b3AgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBQQlMgbXVzdCBiZSBzcGVjaWZpZWQgdmlhIFwiLS13aXRoLXBicz1ESVJcIi4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgotICBhY19jdF9DQz0kQ0MKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZWxzZQotICBDQz0iJGFjX2N2X3Byb2dfQ0MiCi1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgZmkKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBhY19wcm9nX3JlamVjdGVkPW5vCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLSAgICAgICBjb250aW51ZQotICAgICBmaQotICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLSAgZG8KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJENDIiAmJiBicmVhawotICBkb25lCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBhY19jdF9DQz0kQ0MKLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKLWRvbmUKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1maQotCi1maQotCi0KLXRlc3QgLXogIiRDQyIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQotYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoteyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoteyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC1WID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAtViA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLmV4ZSBiLm91dCIKLSMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KLSMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KLSMgb2YgZXhlZXh0LgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICRFQ0hPX0MiID4mNjsgfQotYWNfbGlua19kZWZhdWx0PWBlY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAotIwotIyBMaXN0IG9mIHBvc3NpYmxlIG91dHB1dCBmaWxlcywgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBsaWtlbHkuCi0jIFRoZSBhbGdvcml0aG0gaXMgbm90IHJvYnVzdCB0byBqdW5rIGluIGAuJywgaGVuY2UgZ28gdG8gd2lsZGNhcmRzIChhLiopCi0jIG9ubHkgYXMgYSBsYXN0IHJlc29ydC4gIGIub3V0IGlzIGNyZWF0ZWQgYnkgaTk2MCBjb21waWxlcnMuCi1hY19maWxlcz0nYV9vdXQuZXhlIGEuZXhlIGNvbmZ0ZXN0LmV4ZSBhLm91dCBjb25mdGVzdCBhLiogY29uZnRlc3QuKiBiLm91dCcKLSMKLSMgVGhlIElSSVggNiBsaW5rZXIgd3JpdGVzIGludG8gZXhpc3RpbmcgZmlsZXMgd2hpY2ggbWF5IG5vdCBiZQotIyBleGVjdXRhYmxlLCByZXRhaW5pbmcgdGhlaXIgcGVybWlzc2lvbnMuICBSZW1vdmUgdGhlbSBmaXJzdCBzbyBhCi0jIHN1YnNlcXVlbnQgZXhlY3V0aW9uIHRlc3Qgd29ya3MuCi1hY19ybWZpbGVzPQotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCi1kbwotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OwotICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OwotICBlc2FjCi1kb25lCi1ybSAtZiAkYWNfcm1maWxlcwotCi1pZiB7IChhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGlua19kZWZhdWx0IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KLSMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCi0jIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAotIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KLSMgQXV0b2NvbmYuCi1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKLWRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKQotCTs7Ci0gICAgW2FiXS5vdXQgKQotCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0Ci0JIyBjZXJ0YWlubHkgcmlnaHQuCi0JYnJlYWs7OwotICAgICouKiApCi0gICAgICAgIGlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOwotCXRoZW4gOjsgZWxzZQotCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCWZpCi0JIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Ci0JIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCi0JIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCi0JIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCi0JIyBhY3R1YWxseSB3b3JraW5nLgotCWJyZWFrOzsKLSAgICAqICkKLQlicmVhazs7Ci0gIGVzYWMKLWRvbmUKLXRlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQotCi1lbHNlCi0gIGFjX2ZpbGU9JycKLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNjsgfQotaWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci1maQotCi1hY19leGVleHQ9JGFjX2N2X2V4ZWV4dAotCi0jIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgotIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gJEVDSE9fQyIgPiY2OyB9Ci0jIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCi0jIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCi0gIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz1ubwotICBlbHNlCi0gICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgotCWNyb3NzX2NvbXBpbGluZz15ZXMKLSAgICBlbHNlCi0JeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgotSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgZmkKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotCi1ybSAtZiBhLm91dCBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi0jIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgotIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICRFQ0hPX0MiID4mNjsgfQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRjcm9zc19jb21waWxpbmciID4mNjsgfQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0jIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKLSMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCi0jIGBybScuCi1mb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JICBicmVhazs7Ci0gICAgKiApIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2V4ZWV4dCIgPiY2OyB9Ci0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLUVYRUVYVD0kYWNfY3ZfZXhlZXh0Ci1hY19leGVleHQ9JEVYRUVYVAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7Ci0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgKSA7OwotICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAotICAgICAgIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1ybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29iamV4dCIgPiY2OyB9Ci1PQkpFWFQ9JGFjX2N2X29iamV4dAotYWNfb2JqZXh0PSRPQkpFWFQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotI2lmbmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0jZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2NvbXBpbGVyX2dudT15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2NvbXBpbGVyX2dudT1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1hY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251Ci0KLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQotR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCi1hY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9Ci1hY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwotICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKLSAgIGFjX2N2X3Byb2dfY2NfZz1ubwotICAgQ0ZMQUdTPSItZyIKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCUNGTEFHUz0iIgotICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi0JIENGTEFHUz0iLWciCi0JIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfZyIgPiY2OyB9Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfYzg5PW5vCi1hY19zYXZlX0NDPSRDQwotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwotc3RydWN0IGJ1ZiB7IGludCB4OyB9OwotRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKLXN0YXRpYyBjaGFyICplIChwLCBpKQotICAgICBjaGFyICoqcDsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiBwW2ldOwotfQotc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQotewotICBjaGFyICpzOwotICB2YV9saXN0IHY7Ci0gIHZhX3N0YXJ0ICh2LHApOwotICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwotICB2YV9lbmQgKHYpOwotICByZXR1cm4gczsKLX0KLQotLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKLSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAotICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwotCi0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0KLWludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwotc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50IGFyZ2M7Ci1jaGFyICoqYXJndjsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCi0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKLWRvCi0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNfc2F2ZV9DQwotCi1maQotIyBBQ19DQUNIRV9WQUwKLWNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1Ci1lY2hvICIke0VDSE9fVH1ub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKLWVjaG8gIiR7RUNIT19UfXVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwotZXNhYwotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLURFUERJUj0iJHthbV9fbGVhZGluZ19kb3R9ZGVwcyIKLQotYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlcGZpbGVzIgotCi0KLWFtX21ha2U9JHtNQUtFLW1ha2V9Ci1jYXQgPiBjb25maW5jIDw8ICdFTkQnCi1hbV9fZG9pdDoKLQlAZWNobyBkb25lCi0uUEhPTlk6IGFtX19kb2l0Ci1FTkQKLSMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICRFQ0hPX0MiID4mNjsgfQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCi0jIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCi0jIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0Ci0jIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAotIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCi1pZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KLSAgIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgIGFtX19xdW90ZT0KLSAgIF9hbV9yZXN1bHQ9R05VCi1maQotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCi0gICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQotICAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgIF9hbV9yZXN1bHQ9QlNECi0gICBmaQotZmkKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRfYW1fcmVzdWx0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRfYW1fcmVzdWx0IiA+JjY7IH0KLXJtIC1mIGNvbmZpbmMgY29uZm1mCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZzsKLWZpCi0KLWlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgotICBBTURFUEJBQ0tTTEFTSD0nXCcKLWZpCi0gaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIEFNREVQX1RSVUU9Ci0gIEFNREVQX0ZBTFNFPScjJwotZWxzZQotICBBTURFUF9UUlVFPScjJwotICBBTURFUF9GQUxTRT0KLWZpCi0KLQotCi1kZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKLSAgZmkKLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgY2FzZSAkZGVwbW9kZSBpbgotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KLSAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKLSAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKLSAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCi0gICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KLSAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCi0gICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKLSAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAotICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgICAgICAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotCi0gIGNkIC4uCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLWVsc2UKLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9Ci1DQ0RFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKLQotIGlmCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCi0gIGFtX19mYXN0ZGVwQ0NfVFJVRT0KLSAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0nIycKLWVsc2UKLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPScjJwotICBhbV9fZmFzdGRlcENDX0ZBTFNFPQotZmkKLQotCi1pZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICRFQ0hPX0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICRFQ0hPX0MiID4mNjsgfQotZmkKLXNldCBkdW1teSAkQ0M7IGFjX2NjPWBlY2hvICQyIHwKLQkJICAgICAgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi0jIE1ha2Ugc3VyZSBpdCB3b3JrcyBib3RoIHdpdGggJENDIGFuZCB3aXRoIHNpbXBsZSBjYy4KLSMgV2UgZG8gdGhlIHRlc3QgdHdpY2UgYmVjYXVzZSBzb21lIGNvbXBpbGVycyByZWZ1c2UgdG8gb3ZlcndyaXRlIGFuCi0jIGV4aXN0aW5nIC5vIGZpbGUgd2l0aCAtbywgdGhvdWdoIHRoZXkgd2lsbCBjcmVhdGUgb25lLgotYWNfdHJ5PSckQ0MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JjUnCi1ybSAtZiBjb25mdGVzdDIuKgotaWYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07Ci10aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289eWVzCi0gIGlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICAgICMgVGVzdCBmaXJzdCB0aGF0IGNjIGV4aXN0cyBhdCBhbGwuCi0gICAgaWYgeyBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgICAgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLSAgICAgIHJtIC1mIGNvbmZ0ZXN0Mi4qCi0gICAgICBpZiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OwotICAgICAgdGhlbgotCSMgY2Mgd29ya3MgdG9vLgotCToKLSAgICAgIGVsc2UKLQkjIGNjIGV4aXN0cyBidXQgZG9lc24ndCBsaWtlIC1vLgotCWV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QqCi0KLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2NfbyA9IHllczsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgTk9fTUlOVVNfQ19NSU5VU19PIDEKLV9BQ0VPRgotCi1maQotCi0jIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKLSMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgotc2V0IGR1bW15ICRDQwotYWNfY2M9YGVjaG8gJDIgfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19jY18nJHthY19jY31fY19vYFwiICE9IHllcyI7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLWNhc2UgJGFzX2Rpci8gaW4KLSAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKLSAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCi0gID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAotICAvdXNyL3VjYi8qICkgOzsKLSAgKikKLSAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICMgYnkgZGVmYXVsdC4KLSAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKLQkgICAgYnJlYWsgMwotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjY7IH0KLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1zZXQgeCAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiB7IGFzX3Zhcj1hY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgotU0hFTEwgPSAvYmluL3NoCi1hbGw6Ci0JQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKLV9BQ0VPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1jYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KLSAgKkBAQCUlJT0/Kj1AQEAlJSUqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7Ci0gICopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OwotZXNhYwotcm0gLWYgY29uZnRlc3QubWFrZQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotICBTRVRfTUFLRT0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFJBTkxJQiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi0gIGFjX2N0X1JBTkxJQj0kUkFOTElCCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCi1pZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1JBTkxJQiIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCi0gICAgUkFOTElCPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgUkFOTElCPSRhY19jdF9SQU5MSUIKLSAgZmkKLWVsc2UKLSAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1maQotCi0KLUNGTEFHUz0iJENGTEFHUyAtV2FsbCAtSSRVVElMUy9pbmNsdWRlIC1JJFBST1hZL2luY2x1ZGUgLUkkUEJTRElSL2luY2x1ZGUiCi1MSUJTPSIkTElCUyAtTCRVVElMUyAtTCRQUk9YWSAtTCRQQlNESVIvbGliIgotCi0KLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYml0c2V0X25ldyBpbiAtbHV0aWxzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGJpdHNldF9uZXcgaW4gLWx1dGlscy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWx1dGlscyAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBiaXRzZXRfbmV3ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gYml0c2V0X25ldyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXc9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldyA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCVVRJTFMgMQotX0FDRU9GCi0KLSAgTElCUz0iLWx1dGlscyAkTElCUyIKLQotZmkKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHJveHlfc3ZyX2luaXQgaW4gLWxwcm94eXN2ciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwcm94eV9zdnJfaW5pdCBpbiAtbHByb3h5c3ZyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwcm94eXN2ciAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwcm94eV9zdnJfaW5pdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHByb3h5X3N2cl9pbml0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9wcm94eXN2cl9wcm94eV9zdnJfaW5pdCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQlBST1hZU1ZSIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1scHJveHlzdnIgJExJQlMiCi0KLWZpCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBic19jb25uZWN0IGluIC1sdG9ycXVlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBic19jb25uZWN0IGluIC1sdG9ycXVlLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfdG9ycXVlX3Bic19jb25uZWN0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sdG9ycXVlICAkTElCUyIKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHBic19jb25uZWN0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcGJzX2Nvbm5lY3QgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9saWJfdG9ycXVlX3Bic19jb25uZWN0PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGliX3RvcnF1ZV9wYnNfY29ubmVjdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3RvcnF1ZV9wYnNfY29ubmVjdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3RvcnF1ZV9wYnNfY29ubmVjdCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfdG9ycXVlX3Bic19jb25uZWN0ID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJUT1JRVUUgMQotX0FDRU9GCi0KLSAgTElCUz0iLWx0b3JxdWUgJExJQlMiCi0KLWZpCi0KLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICRFQ0hPX0MiID4mNjsgfQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1BQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKLSAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgotICAgIGRvCi0gICAgICBhY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLWRvCi0gICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCi0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuCi0gIGJyZWFrCi1maQotCi0gICAgZG9uZQotICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLQotZmkKLSAgQ1BQPSRhY19jdl9wcm9nX0NQUAotZWxzZQotICBhY19jdl9wcm9nX0NQUD0kQ1BQCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1BQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDUFAiID4mNjsgfQotYWNfcHJlcHJvY19vaz1mYWxzZQotZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCi1kbwotICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0gICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgotICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0JCSAgICAgU3ludGF4IGVycm9yCi1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbgotICA6Ci1lbHNlCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ3JlcCBnZ3JlcCIgdG8gdXNlIGluIG1zZyBvdXRwdXQKLWlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotc2V0IGR1bW15IGdyZXAgZ2dyZXA7IGFjX3Byb2dfbmFtZT0kMgotaWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfcGF0aF9HUkVQX2ZvdW5kPWZhbHNlCi0jIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKLSAgICAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCi1jYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID4iY29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICBlY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYWNfY291bnQ9YGV4cHIgJGFjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKLSAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLQotICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMwotICBkb25lCi1kb25lCi0KLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotCi1HUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgotaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotZWxzZQotICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKLWZpCi0KLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KLSBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQotICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKLSAgIGVsc2UKLSAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJlZ3JlcCIgdG8gdXNlIGluIG1zZyBvdXRwdXQKLWlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLXNldCBkdW1teSBlZ3JlcDsgYWNfcHJvZ19uYW1lPSQyCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQotIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIGVncmVwOyBkbwotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQotICAgICMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAotY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgIGVjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCi0gICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawotICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCi0gICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotCi0gICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMwotICBkb25lCi1kb25lCi0KLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotCi1FR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCi1pZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotZWxzZQotICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAotZmkKLQotCi0gICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQotIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQotIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2Vsc2UKLSMgZGVmaW5lIElTTE9XRVIoYykgXAotCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAotCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKLQkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCi0jZW5kaWYKLQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludAotbWFpbiAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKLQl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKLSAgICAgIHJldHVybiAyOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQotZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLV9BQ0VPRgotCi1maQotCi0jIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgotCi0KLQotCi0KLQotCi0KLQotZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCi0JCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAotZG8KLWFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCi0KLWZvciBhY19oZWFkZXIgaW4gcGJzX2lmbC5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+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+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1lbHNlCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHBic19pZmwuaCBub3QgZm91bmQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcGJzX2lmbC5oIG5vdCBmb3VuZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotZG9uZQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaWduYWwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLWludAotbWFpbiAoKQotewotcmV0dXJuICooc2lnbmFsICgwLCAwKSkgKDApID09IDE7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfdHlwZV9zaWduYWw9aW50Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX3NpZ25hbD12b2lkCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpZ25hbCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaWduYWwiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1fQUNFT0YKLQotCi0KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSIKLQotY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KLSMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKLSMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKLSMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCi0jIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCi0jIGZvbGxvd2luZyB2YWx1ZXMuCi0KLV9BQ0VPRgotCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAoc2V0KSAyPiYxIHwKLSAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCi0gICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQotICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZQotICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgICBzZWQgLW4gXAotCSJzLycvJ1xcXFwnJy9nOwotCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgotICAgICAgOzsgIygKLSAgICAqKQotICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCi0gICAgICA7OwotICAgIGVzYWMgfAotICAgIHNvcnQKLSkgfAotICBzZWQgJwotICAgICAvXmFjX2N2X2Vudl8vYiBlbmQKLSAgICAgdCBjbGVhcgotICAgICA6Y2xlYXIKLSAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLwotICAgICB0IGVuZAotICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KLSAgICAgOmVuZCcgPj5jb25mY2FjaGUKLWlmIGRpZmYgIiRjYWNoZV9maWxlIiBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICAgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCIgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gICAgY2F0IGNvbmZjYWNoZSA+JGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi1hY19saWJvYmpzPQotYWNfbHRsaWJvYmpzPQotZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCi0gICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KLSAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCi0gIGFjX2k9YGVjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0gICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKLSAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCi0gIGFjX2xpYm9ianM9IiRhY19saWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgotICBhY19sdGxpYm9ianM9IiRhY19sdGxpYm9ianMgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKLWRvbmUKLUxJQk9CSlM9JGFjX2xpYm9ianMKLQotTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKLQotCi1pZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLWlmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQotZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KLWNhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSMhICRTSEVMTAotIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWRlYnVnPWZhbHNlCi1hY19jc19yZWNoZWNrPWZhbHNlCi1hY19jc19zaWxlbnQ9ZmFsc2UKLVNIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9Ci1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLWVzYWMKLQotZmkKLQotCi0KLQotIyBQQVRIIG5lZWRzIENSCi0jIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCi1hc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLWFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwotYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCi1hc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCi1hc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCi0gIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKLSAgY2htb2QgK3ggY29uZiQkLnNoCi0gIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIGVsc2UKLSAgICBQQVRIX1NFUEFSQVRPUj06Ci0gIGZpCi0gIHJtIC1mIGNvbmYkJC5zaAotZmkKLQotIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCi1pZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdW5zZXQ9dW5zZXQKLWVsc2UKLSAgYXNfdW5zZXQ9ZmFsc2UKLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotYXNfbmw9JwotJwotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotY2FzZSAkMCBpbgotICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0gICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICAgICA7OwotZXNhYwotIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJwotIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCi1pZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCi0gIGFzX215c2VsZj0kMAotZmkKLWlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KLSAgZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KLSMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgotZm9yIGFzX3ZhciBpbiBFTlYgTUFJTCBNQUlMUEFUSAotZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotZm9yIGFzX3ZhciBpbiBcCi0gIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCi0gIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCi0gIExDX1RFTEVQSE9ORSBMQ19USU1FCi1kbwotICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgotICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgotICBlbHNlCi0gICAgKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKLSAgZmkKLWRvbmUKLQotIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLWlmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KLSAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKLWVsc2UKLSAgYXNfYmFzZW5hbWU9ZmFsc2UKLWZpCi0KLQotIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgotYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8Ci0kYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0KLSMgQ0RQQVRILgotJGFzX3Vuc2V0IENEUEFUSAotCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgewotCi0gICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KLSAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQotICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKLSAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKLSAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcwotICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCi0gICMgY2FzZSBhdCBsaW5lIGVuZC4KLSAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCi0gICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQotICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQotICBzZWQgLW4gJwotICAgIHAKLSAgICAvWyRdTElORU5PLz0KLSAgJyA8JGFzX215c2VsZiB8Ci0gICAgc2VkICcKLSAgICAgIHMvWyRdTElORU5PLiovJi0vCi0gICAgICB0IGxpbmVubwotICAgICAgYgotICAgICAgOmxpbmVubwotICAgICAgTgotICAgICAgOmxvb3AKLSAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwotICAgICAgdCBsb29wCi0gICAgICBzLy1cbi4qLy8KLSAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLSAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0gICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCi0gIC4gIi4vJGFzX21lLmxpbmVubyIKLSAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0gIGV4aXQKLX0KLQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3hcYydgIGluCi0gICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICAqKSAgIEVDSE9fQz0nXGMnOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLWlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgotICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCi1lbHNlCi0gIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpcgotZmkKLWVjaG8gPmNvbmYkJC5maWxlCi1pZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz0nbG4gLXMnCi0gICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgotICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgYXNfbG5fcz0nY3AgLXAnCi1lbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPWxuCi1lbHNlCi0gIGFzX2xuX3M9J2NwIC1wJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPToKLWVsc2UKLSAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSAgYXNfbWtkaXJfcD1mYWxzZQotZmkKLQotaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc190ZXN0X3g9J3Rlc3QgLXgnCi1lbHNlCi0gIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGFzX2xzX0xfb3B0aW9uPUwKLSAgZWxzZQotICAgIGFzX2xzX0xfb3B0aW9uPQotICBmaQotICBhc190ZXN0X3g9JwotICAgIGV2YWwgc2ggLWMgJ1wnJwotICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCi0gICAgICAgIHRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4KLSAgICAgICAgLSopc2V0ICIuLyQxIjs7Ci0JZXNhYzsKLQljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi1hc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLWFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLQotZXhlYyA2PiYxCi0KLSMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJFswXSBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCi0jIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKLSMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCi1hY19sb2c9IgotVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBvcmcuZWNsaXBzZS5wdHAucGJzICRhc19tZSAzLjAuMCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0JCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1Db25maWd1cmF0aW9uIGNvbW1hbmRzOgotJGNvbmZpZ19jb21tYW5kcwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotYWNfY3NfdmVyc2lvbj0iXFwKLW9yZy5lY2xpcHNlLnB0cC5wYnMgY29uZmlnLnN0YXR1cyAzLjAuMAotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLAotICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYFxcIgotCi1Db3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCi0KLWFjX3B3ZD0nJGFjX3B3ZCcKLXNyY2Rpcj0nJHNyY2RpcicKLUlOU1RBTEw9JyRJTlNUQUxMJwotTUtESVJfUD0nJE1LRElSX1AnCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0jIElmIG5vIGZpbGUgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB3ZSBuZWVkIHRvIHByb3ZpZGUgZGVmYXVsdAotIyB2YWx1ZS4gIEJ5IHdlIG5lZWQgdG8ga25vdyBpZiBmaWxlcyB3ZXJlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KLWFjX25lZWRfZGVmYXVsdHM9Ogotd2hpbGUgdGVzdCAkIyAhPSAwCi1kbwotICBjYXNlICQxIGluCi0gIC0tKj0qKQotICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCi0gICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAotICAgIGFjX3NoaWZ0PToKLSAgICA7OwotICAqKQotICAgIGFjX29wdGlvbj0kMQotICAgIGFjX29wdGFyZz0kMgotICAgIGFjX3NoaWZ0PXNoaWZ0Ci0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBhY19jc19yZWNoZWNrPTogOzsKLSAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQotICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZSB8IC0taCkKLSAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIC0taGVscCB8IC0taGVsIHwgLWggKQotICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQotICAgIGFjX2NzX3NpbGVudD06IDs7Ci0KLSAgIyBUaGlzIGlzIGFuIGVycm9yLgotICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Ci0KLSAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKLSAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OwotCi0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Ci0KLWlmICRhY19jc19zaWxlbnQ7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgotZmkKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIGVjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCAkU0hFTEwgJDAgIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iID4mNgotICBDT05GSUdfU0hFTEw9JFNIRUxMCi0gIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgZXhlYyAkU0hFTEwgIiQwIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKLSMjIFJ1bm5pbmcgJGFzX21lLiAjIwotX0FTQk9YCi0gIGVjaG8gIiRhY19sb2ciCi19ID4mNQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jCi0jIElOSVQtQ09NTUFORFMKLSMKLUFNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotCi0jIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KLWZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotZG8KLSAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgotICAgICJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgY29uZmlnLmgiIDs7Ci0gICAgImRlcGZpbGVzIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLQotICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIGVzYWMKLWRvbmUKLQotCi0jIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCi0jIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KLSMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCi1pZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgotICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycwotICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcwotZmkKLQotIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCi0jIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0jIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0jIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0jIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KLSRkZWJ1ZyB8fAotewotICB0bXA9Ci0gIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8Ci17Ci0gICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci19Ci0KLSMKLSMgU2V0IHVwIHRoZSBzZWQgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCi0jCi0KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotCi1fQUNFT0YKLQotCi0KLWFjX2RlbGltPSclIV8hIyAnCi1mb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KLSAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgotU0hFTEwhJFNIRUxMJGFjX2RlbGltCi1QQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KLVBBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCi1QQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQotUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KLVBBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQotUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCi1leGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KLXByZWZpeCEkcHJlZml4JGFjX2RlbGltCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCi1iaW5kaXIhJGJpbmRpciRhY19kZWxpbQotc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQotbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQotZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCi1kYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCi1zeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCi1zaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KLWxvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KLWluY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KLW9sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KLWRvY2RpciEkZG9jZGlyJGFjX2RlbGltCi1pbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCi1odG1sZGlyISRodG1sZGlyJGFjX2RlbGltCi1kdmlkaXIhJGR2aWRpciRhY19kZWxpbQotcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KLXBzZGlyISRwc2RpciRhY19kZWxpbQotbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KLWxvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCi1tYW5kaXIhJG1hbmRpciRhY19kZWxpbQotREVGUyEkREVGUyRhY19kZWxpbQotRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KLUVDSE9fTiEkRUNIT19OJGFjX2RlbGltCi1FQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQotTElCUyEkTElCUyRhY19kZWxpbQotYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCi1ob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCi10YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQotSU5TVEFMTF9QUk9HUkFNISRJTlNUQUxMX1BST0dSQU0kYWNfZGVsaW0KLUlOU1RBTExfU0NSSVBUISRJTlNUQUxMX1NDUklQVCRhY19kZWxpbQotSU5TVEFMTF9EQVRBISRJTlNUQUxMX0RBVEEkYWNfZGVsaW0KLWFtX19pc3JjISRhbV9faXNyYyRhY19kZWxpbQotQ1lHUEFUSF9XISRDWUdQQVRIX1ckYWNfZGVsaW0KLVBBQ0tBR0UhJFBBQ0tBR0UkYWNfZGVsaW0KLVZFUlNJT04hJFZFUlNJT04kYWNfZGVsaW0KLUFDTE9DQUwhJEFDTE9DQUwkYWNfZGVsaW0KLUFVVE9DT05GISRBVVRPQ09ORiRhY19kZWxpbQotQVVUT01BS0UhJEFVVE9NQUtFJGFjX2RlbGltCi1BVVRPSEVBREVSISRBVVRPSEVBREVSJGFjX2RlbGltCi1NQUtFSU5GTyEkTUFLRUlORk8kYWNfZGVsaW0KLWluc3RhbGxfc2ghJGluc3RhbGxfc2gkYWNfZGVsaW0KLVNUUklQISRTVFJJUCRhY19kZWxpbQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNISRJTlNUQUxMX1NUUklQX1BST0dSQU0kYWNfZGVsaW0KLW1rZGlyX3AhJG1rZGlyX3AkYWNfZGVsaW0KLUFXSyEkQVdLJGFjX2RlbGltCi1TRVRfTUFLRSEkU0VUX01BS0UkYWNfZGVsaW0KLWFtX19sZWFkaW5nX2RvdCEkYW1fX2xlYWRpbmdfZG90JGFjX2RlbGltCi1BTVRBUiEkQU1UQVIkYWNfZGVsaW0KLWFtX190YXIhJGFtX190YXIkYWNfZGVsaW0KLWFtX191bnRhciEkYW1fX3VudGFyJGFjX2RlbGltCi1idWlsZCEkYnVpbGQkYWNfZGVsaW0KLWJ1aWxkX2NwdSEkYnVpbGRfY3B1JGFjX2RlbGltCi1idWlsZF92ZW5kb3IhJGJ1aWxkX3ZlbmRvciRhY19kZWxpbQotYnVpbGRfb3MhJGJ1aWxkX29zJGFjX2RlbGltCi1QQlNESVIhJFBCU0RJUiRhY19kZWxpbQotQ0MhJENDJGFjX2RlbGltCi1DRkxBR1MhJENGTEFHUyRhY19kZWxpbQotTERGTEFHUyEkTERGTEFHUyRhY19kZWxpbQotQ1BQRkxBR1MhJENQUEZMQUdTJGFjX2RlbGltCi1hY19jdF9DQyEkYWNfY3RfQ0MkYWNfZGVsaW0KLUVYRUVYVCEkRVhFRVhUJGFjX2RlbGltCi1PQkpFWFQhJE9CSkVYVCRhY19kZWxpbQotREVQRElSISRERVBESVIkYWNfZGVsaW0KLWFtX19pbmNsdWRlISRhbV9faW5jbHVkZSRhY19kZWxpbQotYW1fX3F1b3RlISRhbV9fcXVvdGUkYWNfZGVsaW0KLUFNREVQX1RSVUUhJEFNREVQX1RSVUUkYWNfZGVsaW0KLUFNREVQX0ZBTFNFISRBTURFUF9GQUxTRSRhY19kZWxpbQotQU1ERVBCQUNLU0xBU0ghJEFNREVQQkFDS1NMQVNIJGFjX2RlbGltCi1DQ0RFUE1PREUhJENDREVQTU9ERSRhY19kZWxpbQotYW1fX2Zhc3RkZXBDQ19UUlVFISRhbV9fZmFzdGRlcENDX1RSVUUkYWNfZGVsaW0KLWFtX19mYXN0ZGVwQ0NfRkFMU0UhJGFtX19mYXN0ZGVwQ0NfRkFMU0UkYWNfZGVsaW0KLVJBTkxJQiEkUkFOTElCJGFjX2RlbGltCi1DUFAhJENQUCRhY19kZWxpbQotR1JFUCEkR1JFUCRhY19kZWxpbQotRUdSRVAhJEVHUkVQJGFjX2RlbGltCi1MSUJPQkpTISRMSUJPQkpTJGFjX2RlbGltCi1MVExJQk9CSlMhJExUTElCT0JKUyRhY19kZWxpbQotX0FDRU9GCi0KLSAgaWYgdGVzdCBgc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLnNlZCB8IGdyZXAgLWMgWGAgPSA4NjsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLWFjX2VvZj1gc2VkIC1uICcvXkNFT0ZbMC05XSokL3MvQ0VPRi8wL3AnIGNvbmYkJHN1YnMuc2VkYAotaWYgdGVzdCAtbiAiJGFjX2VvZiI7IHRoZW4KLSAgYWNfZW9mPWBlY2hvICIkYWNfZW9mIiB8IHNvcnQgLW5ydSB8IHNlZCAxcWAKLSAgYWNfZW9mPWBleHByICRhY19lb2YgKyAxYAotZmkKLQotY2F0ID4+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+L2Rldi9udWxsCi0gICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKLSAgZXhlYyA1Pj5jb25maWcubG9nCi0gICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCi0gICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgotICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbmZpZ3VyZS5pbiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1MGJmNy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1kbmwKLWRubAotCi1BQ19QUkVSRVEoWzIuNTBdKQotCi1BQ19JTklUKFtvcmcuZWNsaXBzZS5wdHAucGJzXSwgWzMuMC4wXSkKLUFDX0NPTkZJR19TUkNESVIoW3NyYy9wdHBfcGJzX3Byb3h5LmNdKQotCi1BTV9JTklUX0FVVE9NQUtFKFtzdWJkaXItb2JqZWN0c10pCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCi1BQ19DQU5PTklDQUxfQlVJTEQKLQotZG5sCi1kbmwgRWNsaXBzZSBhZGRzIHZlcnNpb24gbnVtYmVyIHRvIGVuZCBvZiBwYWNrYWdlIHdoZW4gZGVwbG95aW5nIHZpYSB1cGRhdGUgc2l0ZQotZG5sCi0KLVVUSUxTPSIuLi9vcmcuZWNsaXBzZS5wdHAudXRpbHMiCi1pZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JVVRJTFM9ImBlY2hvICR7VVRJTFN9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JCUFDX01TR19FUlJPUihbdXRpbHMgZGlyZWN0b3J5IG5vdCBmb3VuZF0pCi0JZmkKLWZpCi0KLVBST1hZPSIuLi9vcmcuZWNsaXBzZS5wdHAucHJveHkiCi1pZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JUFJPWFk9ImBlY2hvICR7UFJPWFl9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JCUFDX01TR19FUlJPUihbcHJveHkgZGlyZWN0b3J5IG5vdCBmb3VuZF0pCi0JZmkKLWZpCi0KLWRubCBQQlMKLQotQUNfQVJHX1dJVEgoW3Bic10sIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtcGJzXSwKLQlbU3BlY2lmeSB0aGUgdG9wIGRpciBvZiBpbnN0YWxsZWQgUEJTIHJtcy5APDpAUkVRVUlSRURAOj5AXSksW10sW3dpdGhfcGJzPW5vXSkKLQotUEJTRElSPQotQVNfSUYoW3Rlc3QgIngkd2l0aF9wYnMiICE9IHhub10sW0FDX1NVQlNUKFtQQlNESVJdLFskd2l0aF9wYnNdKV0sCi0gICAgICAgQUNfTVNHX0VSUk9SKFtUaGUgdG9wIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgUEJTIG11c3QgYmUgc3BlY2lmaWVkIHZpYSAiLS13aXRoLXBicz1ESVIiLl0pKQotCi0KLWRubAotZG5sIENoZWNrIGZvciBwcm9ncmFtcy4KLWRubAotCi1BQ19QUk9HX0NDCi1BTV9QUk9HX0NDX0NfTwotQUNfUFJPR19JTlNUQUxMCi1BQ19QUk9HX01BS0VfU0VUCi1BQ19QUk9HX1JBTkxJQgotCi1DRkxBR1M9IiRDRkxBR1MgLVdhbGwgLUkkVVRJTFMvaW5jbHVkZSAtSSRQUk9YWS9pbmNsdWRlIC1JJFBCU0RJUi9pbmNsdWRlIgotTElCUz0iJExJQlMgLUwkVVRJTFMgLUwkUFJPWFkgLUwkUEJTRElSL2xpYiIKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIGxpYnJhcmllcy4KLWRubAotCi1BQ19DSEVDS19MSUIoW3V0aWxzXSwgW2JpdHNldF9uZXddKQotQUNfQ0hFQ0tfTElCKFtwcm94eXN2cl0sIFtwcm94eV9zdnJfaW5pdF0pCi1BQ19DSEVDS19MSUIoW3RvcnF1ZV0sW3Bic19jb25uZWN0XSkKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcy4KLWRubAotCi1BQ19IRUFERVJfU1REQwotQUNfQ0hFQ0tfSEVBREVSUyhbcGJzX2lmbC5oXSxbXSwKLQkJCQlbQUNfTVNHX0VSUk9SKFtwYnNfaWZsLmggbm90IGZvdW5kXSldKQotCi1kbmwKLWRubCBDaGVjayBmb3IgdHlwZXMKLWRubAotQUNfVFlQRV9TSUdOQUwKLQotQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCi1BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2RlcGNvbXAgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9kZXBjb21wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTVlYTRlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L2RlcGNvbXAKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCi0KLXNjcmlwdHZlcnNpb249MjAwNi0xMC0xNS4xOAotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPi4KLQotY2FzZSAkMSBpbgotICAnJykKLSAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICAgICBleGl0IDE7Ci0gICAgIDs7Ci0gIC1oIHwgLS1oKikKLSAgICBjYXQgPDxcRU9GCi1Vc2FnZTogZGVwY29tcCBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQotCi1SdW4gUFJPR1JBTVMgQVJHUyB0byBjb21waWxlIGEgZmlsZSwgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMKLWFzIHNpZGUtZWZmZWN0cy4KLQotRW52aXJvbm1lbnQgdmFyaWFibGVzOgotICBkZXBtb2RlICAgICBEZXBlbmRlbmN5IHRyYWNraW5nIG1vZGUuCi0gIHNvdXJjZSAgICAgIFNvdXJjZSBmaWxlIHJlYWQgYnkgYFBST0dSQU1TIEFSR1MnLgotICBvYmplY3QgICAgICBPYmplY3QgZmlsZSBvdXRwdXQgYnkgYFBST0dSQU1TIEFSR1MnLgotICBERVBESVIgICAgICBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgZGVwZW5kZW5jaWVzLgotICBkZXBmaWxlICAgICBEZXBlbmRlbmN5IGZpbGUgdG8gb3V0cHV0LgotICB0bXBkZXBmaWxlICBUZW1wb3JhcnkgZmlsZSB0byB1c2Ugd2hlbiBvdXRwdXRpbmcgZGVwZW5kZW5jaWVzLgotICBsaWJ0b29sICAgICBXaGV0aGVyIGxpYnRvb2wgaXMgdXNlZCAoeWVzL25vKS4KLQotUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KLUVPRgotICAgIGV4aXQgJD8KLSAgICA7OwotICAtdiB8IC0tdiopCi0gICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKLSAgICBleGl0ICQ/Ci0gICAgOzsKLWVzYWMKLQotaWYgdGVzdCAteiAiJGRlcG1vZGUiIHx8IHRlc3QgLXogIiRzb3VyY2UiIHx8IHRlc3QgLXogIiRvYmplY3QiOyB0aGVuCi0gIGVjaG8gImRlcGNvbXA6IFZhcmlhYmxlcyBzb3VyY2UsIG9iamVjdCBhbmQgZGVwbW9kZSBtdXN0IGJlIHNldCIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgRGVwZW5kZW5jaWVzIGZvciBzdWIvYmFyLm8gb3Igc3ViL2Jhci5vYmogZ28gaW50byBzdWIvLmRlcHMvYmFyLlBvLgotZGVwZmlsZT0ke2RlcGZpbGUtYGVjaG8gIiRvYmplY3QiIHwKLSAgc2VkICdzfFteXFwvXSokfCcke0RFUERJUi0uZGVwc30nLyZ8O3N8XC5cKFteLl0qXCkkfC5QXDF8O3N8UG9iaiR8UG98J2B9Ci10bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQotCi1ybSAtZiAiJHRtcGRlcGZpbGUiCi0KLSMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQotIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKLSMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKLSMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgotICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KLSAgZ2NjZmxhZz0tTQotICBkZXBtb2RlPWdjYwotZmkKLQotaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCi0gICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCi0gICBkYXNobWZsYWc9LXhNCi0gICBkZXBtb2RlPWRhc2htc3Rkb3V0Ci1maQotCi1jYXNlICIkZGVwbW9kZSIgaW4KLWdjYzMpCi0jIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAotIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKLSMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KLSMjIFVuZm9ydHVuYXRlbHksIEZyZWVCU0QgYzg5IGFjY2VwdGFuY2Ugb2YgZmxhZ3MgZGVwZW5kcyB1cG9uCi0jIyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG9yZGVyOyBzbyBhZGQgdGhlIGZsYWdzIHdoZXJlIHRoZXkKLSMjIGFwcGVhciBpbiBkZXBlbmQyLmFtLiAgTm90ZSB0aGF0IHRoZSBzbG93ZG93biBpbmN1cnJlZCBoZXJlCi0jIyBhZmZlY3RzIG9ubHkgY29uZmlndXJlOiBpbiBtYWtlZmlsZXMsICVGQVNUREVQJSBzaG9ydGN1dHMgdGhpcy4KLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1jKSBzZXQgZm5vcmQgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIgIiRhcmciIDs7Ci0gICAgKikgIHNldCBmbm9yZCAiJEAiICIkYXJnIiA7OwotICAgIGVzYWMKLSAgICBzaGlmdCAjIGZub3JkCi0gICAgc2hpZnQgIyAkYXJnCi0gIGRvbmUKLSAgIiRAIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCi0gIDs7Ci0KLWdjYykKLSMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCi0jIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKLSMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCi0jIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCi0jIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQotIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKLSMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgotIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQotIyMgICB0aGFuIHJlbmFtaW5nKS4KLSAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCi0gICAgZ2NjZmxhZz0tTUQsCi0gIGZpCi0gICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ci0jIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCi0gIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAotICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCi0jIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQotIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCi0jIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZwotIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbwotIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4KLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKLSAgICB0ciAnCi0nICcgJyA+PiAkZGVwZmlsZQotICAgIGVjaG8gPj4gJGRlcGZpbGUKLQotICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAotICAgPj4gJGRlcGZpbGUKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKLSAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgotICBlbHNlCi0gICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKLSAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKLSAgZmkKLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotaHAyKQotICAjIFRoZSAiaHAiIHN0YW56YSBhYm92ZSBkb2VzIG5vdCB3b3JrIHdpdGggYUNDIChDKyspIGFuZCBIUCdzIGlhNjQKLSAgIyBjb21waWxlcnMsIHdoaWNoIGhhdmUgaW50ZWdyYXRlZCBwcmVwcm9jZXNzb3JzLiAgVGhlIGNvcnJlY3Qgb3B0aW9uCi0gICMgdG8gdXNlIHdpdGggdGhlc2UgaXMgK01ha2VkOyBpdCB3cml0ZXMgZGVwZW5kZW5jaWVzIHRvIGEgZmlsZSBuYW1lZAotICAjICdmb28uZCcsIHdoaWNoIGxhbmRzIG5leHQgdG8gdGhlIG9iamVjdCBmaWxlLCB3aGVyZXZlciB0aGF0Ci0gICMgaGFwcGVucyB0byBiZS4KLSAgIyBNdWNoIG9mIHRoaXMgaXMgc2ltaWxhciB0byB0aGUgdHJ1NjQgY2FzZTsgc2VlIGNvbW1lbnRzIHRoZXJlLgotICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAotICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAotICAgIHRtcGRlcGZpbGUyPSRkaXIubGlicy8kYmFzZS5kCi0gICAgIiRAIiAtV2MsK01ha2VkCi0gIGVsc2UKLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAotICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCi0gICAgIiRAIiArTWFrZWQKLSAgZmkKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIgotICAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKLSAgZG8KLSAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKLSAgZG9uZQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KLSAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICAjIEFkZCBgZGVwZW5kZW50Lmg6JyBsaW5lcy4KLSAgICBzZWQgLW5lICcyLCR7OyBzL14gKi8vOyBzLyBcXCokLy87IHMvJC86LzsgcDt9JyAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCi0gIGZpCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlMiIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGggVHJ1NjQgY2MsIHNoYXJlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFrZSBhCi0gICAgICAjIHN0YXRpYyBsaWJyYXJ5LiAgVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBpbiBsaWJ0b29sIDEuNCBzZXJpZXMgdG8KLSAgICAgICMgaGFuZGxlIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uLgotICAgICAgIyBXaXRoIGxpYnRvb2wgMS40LCBkZXBlbmRlbmNpZXMgd2VyZSBvdXRwdXQgaW4gJGRpci5saWJzLyRiYXNlLmxvLmQuCi0gICAgICAjCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhpcyBleGNlcHRpb24gd2FzIHJlbW92ZWQsIGFuZCBsaWJ0b29sIG5vdwotICAgICAgIyBnZW5lcmF0ZXMgMiBzZXBhcmF0ZSBvYmplY3RzIGZvciB0aGUgMiBsaWJyYXJpZXMuICBUaGVzZSB0d28KLSAgICAgICMgY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKLSAgICAgICMgaW4gJGRpciRiYXNlLm8uZC4gIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGJvdGggZmlsZXMsIGJlY2F1c2UKLSAgICAgICMgb25lIG9mIHRoZSB0d28gY29tcGlsYXRpb25zIGNhbiBiZSBkaXNhYmxlZC4gIFdlIHNob3VsZCBwcmVmZXIKLSAgICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCi0gICAgICAjIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB3aGVuIC5saWJzLyBpcyBkZWxldGVkLCB3aGlsZSBpZ25vcmluZwotICAgICAgIyB0aGUgZm9ybWVyIHdvdWxkIGNhdXNlIGEgZGlzdGNsZWFuY2hlY2sgcGFuaWMuCi0gICAgICB0bXBkZXBmaWxlMT0kZGlyLmxpYnMvJGJhc2UubG8uZCAgICMgbGlidG9vbCAxLjQKLSAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5vLmQgICAgICAgICAgIyBsaWJ0b29sIDEuNQotICAgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLm8uZCAgICAjIGxpYnRvb2wgMS41Ci0gICAgICB0bXBkZXBmaWxlND0kZGlyLmxpYnMvJGJhc2UuZCAgICAgICMgQ29tcGFxIENDQyBWNi4yLTUwNAotICAgICAgIiRAIiAtV2MsLU1ECi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kCi0gICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAotICAgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLmQKLSAgICAgIHRtcGRlcGZpbGU0PSRkaXIkYmFzZS5kCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKLSAgIGRvCi0gICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhawotICAgZG9uZQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gLWUgJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgXAotICAgICAgIC1lICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyB8Ci0gICAgc2VkICckIHM6IFxcJDo6JyA+ICIkdG1wZGVwZmlsZSIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1tc3Zpc3VhbGNwcCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCi0gICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgIi1HbSJ8Ii9HbSJ8Ii1HaSJ8Ii9HaSJ8Ii1aSSJ8Ii9aSSIpCi0Jc2V0IGZub3JkICIkQCIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICAqKQotCXNldCBmbm9yZCAiJEAiICIkYXJnIgotCXNoaWZ0Ci0Jc2hpZnQKLQk7OwotICAgIGVzYWMKLSAgZG9uZQotICAiJEAiIC1FIHwKLSAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjplY2hvICJgY3lncGF0aCAtdSBcXCJcMVxcImAiOnAnIHwgc29ydCB8IHVuaXEgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCi0gIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKLSAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLW5vbmUpCi0gIGV4ZWMgIiRAIgotICA7OwotCi0qKQotICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKLSAgZXhpdCAxCi0gIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTogc2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOiAyCi0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9pbnN0YWxsLXNoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvaW5zdGFsbC1zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZiYmFlNy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9pbnN0YWxsLXNoCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLQotc2NyaXB0dmVyc2lvbj0yMDA2LTEwLTE0LjE1Ci0KLSMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcwotIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKLSMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQotIwotIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0jIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bwotIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQotIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKLSMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSMKLSMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0jCi0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0jIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0jIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQotIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotIwotIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAotIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KLSMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQotIyB0aXVtLgotIwotIwotIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4KLQotbmw9JwotJwotSUZTPSIgIiIJJG5sIgotCi0jIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKLQotIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgotZG9pdD0iJHtET0lUUFJPRy19IgotaWYgdGVzdCAteiAiJGRvaXQiOyB0aGVuCi0gIGRvaXRfZXhlYz1leGVjCi1lbHNlCi0gIGRvaXRfZXhlYz0kZG9pdAotZmkKLQotIyBQdXQgaW4gYWJzb2x1dGUgZmlsZSBuYW1lcyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsKLSMgb3IgdXNlIGVudmlyb25tZW50IHZhcnMuCi0KLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCi0KLXBvc2l4X2dsb2I9Ci1wb3NpeF9ta2Rpcj0KLQotIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCi1tb2RlPTA3NTUKLQotY2htb2RjbWQ9JGNobW9kcHJvZwotY2hvd25jbWQ9Ci1jaGdycGNtZD0KLXN0cmlwY21kPQotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0KLWRzdD0KLWRpcl9hcmc9Ci1kc3Rhcmc9Ci1ub190YXJnZXRfZGlyZWN0b3J5PQotCi11c2FnZT0iVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFstVF0gU1JDRklMRSBEU1RGSUxFCi0gICBvcjogJDAgW09QVElPTl0uLi4gU1JDRklMRVMuLi4gRElSRUNUT1JZCi0gICBvcjogJDAgW09QVElPTl0uLi4gLXQgRElSRUNUT1JZIFNSQ0ZJTEVTLi4uCi0gICBvcjogJDAgW09QVElPTl0uLi4gLWQgRElSRUNUT1JJRVMuLi4KLQotSW4gdGhlIDFzdCBmb3JtLCBjb3B5IFNSQ0ZJTEUgdG8gRFNURklMRS4KLUluIHRoZSAybmQgYW5kIDNyZCwgY29weSBhbGwgU1JDRklMRVMgdG8gRElSRUNUT1JZLgotSW4gdGhlIDR0aCwgY3JlYXRlIERJUkVDVE9SSUVTLgotCi1PcHRpb25zOgotLWMgICAgICAgICAoaWdub3JlZCkKLS1kICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KLS1nIEdST1VQICAgJGNoZ3JwcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gR1JPVVAuCi0tbSBNT0RFICAgICRjaG1vZHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIE1PREUuCi0tbyBVU0VSICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCi0tcyAgICAgICAgICRzdHJpcHByb2cgaW5zdGFsbGVkIGZpbGVzLgotLXQgRElSRUNUT1JZICBpbnN0YWxsIGludG8gRElSRUNUT1JZLgotLVQgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KLS0taGVscCAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQuCi0tLXZlcnNpb24gIGRpc3BsYXkgdmVyc2lvbiBpbmZvIGFuZCBleGl0LgotCi1FbnZpcm9ubWVudCB2YXJpYWJsZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29tbWFuZHM6Ci0gIENIR1JQUFJPRyBDSE1PRFBST0cgQ0hPV05QUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HIFJNUFJPRyBTVFJJUFBST0cKLSIKLQotd2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC1jKSBzaGlmdAotICAgICAgICBjb250aW51ZTs7Ci0KLSAgICAtZCkgZGlyX2FyZz10cnVlCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKLQotICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLSAgICAgICAgc2hpZnQKLSAgICAgICAgc2hpZnQKLSAgICAgICAgY29udGludWU7OwotCi0gICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKLQotICAgIC1tKSBtb2RlPSQyCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIHNoaWZ0Ci0JY2FzZSAkbW9kZSBpbgotCSAgKicgJyogfCAqJwknKiB8IConCi0nKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQotCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCi0JICAgIGV4aXQgMTs7Ci0JZXNhYwotICAgICAgICBjb250aW51ZTs7Ci0KLSAgICAtbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKLQotICAgIC1zKSBzdHJpcGNtZD0kc3RyaXBwcm9nCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKLQotICAgIC10KSBkc3Rhcmc9JDIKLQlzaGlmdAotCXNoaWZ0Ci0JY29udGludWU7OwotCi0gICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZQotCXNoaWZ0Ci0JY29udGludWU7OwotCi0gICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OwotCi0gICAgLS0pCXNoaWZ0Ci0JYnJlYWs7OwotCi0gICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgotCWV4aXQgMTs7Ci0KLSAgICAqKSAgYnJlYWs7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0YXJnIjsgdGhlbgotICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KLSAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KLSAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgotICBmb3IgYXJnCi0gIGRvCi0gICAgaWYgdGVzdCAtbiAiJGRzdGFyZyI7IHRoZW4KLSAgICAgICMgJEAgaXMgbm90IGVtcHR5OiBpdCBjb250YWlucyBhdCBsZWFzdCAkYXJnLgotICAgICAgc2V0IGZub3JkICIkQCIgIiRkc3RhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgZmkKLSAgICBzaGlmdCAjIGFyZwotICAgIGRzdGFyZz0kYXJnCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgJCMgLWVxIDA7IHRoZW4KLSAgaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCi0gICAgZWNobyAiJDA6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLiIgPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0gICMgSXQncyBPSyB0byBjYWxsIGBpbnN0YWxsLXNoIC1kJyB3aXRob3V0IGFyZ3VtZW50LgotICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbmFsIGRpcmVjdG9yaWVzLgotICBleGl0IDAKLWZpCi0KLWlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgotICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQotCi0gICMgU2V0IHVtYXNrIHNvIGFzIG5vdCB0byBjcmVhdGUgdGVtcHMgd2l0aCB0b28tZ2VuZXJvdXMgbW9kZXMuCi0gICMgSG93ZXZlciwgJ3N0cmlwJyByZXF1aXJlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byB0ZW1wcy4KLSAgY2FzZSAkbW9kZSBpbgotICAgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgotICAgICo2NDQpIGNwX3VtYXNrPTEzMzs7Ci0gICAgKjc1NSkgY3BfdW1hc2s9MjI7OwotCi0gICAgKlswLTddKQotICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgotCXVfcGx1c19ydz0KLSAgICAgIGVsc2UKLQl1X3BsdXNfcnc9JyUgMjAwJwotICAgICAgZmkKLSAgICAgIGNwX3VtYXNrPWBleHByICcoJyA3NzcgLSAkbW9kZSAlIDEwMDAgJyknICR1X3BsdXNfcndgOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgotCXVfcGx1c19ydz0KLSAgICAgIGVsc2UKLQl1X3BsdXNfcnc9LHUrcncKLSAgICAgIGZpCi0gICAgICBjcF91bWFzaz0kbW9kZSR1X3BsdXNfcnc7OwotICBlc2FjCi1maQotCi1mb3Igc3JjCi1kbwotICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCi0gIGNhc2UgJHNyYyBpbgotICAgIC0qKSBzcmM9Li8kc3JjIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICBkc3Q9JHNyYwotICAgIGRzdGRpcj0kZHN0Ci0gICAgdGVzdCAtZCAiJGRzdGRpciIKLSAgICBkc3RkaXJfc3RhdHVzPSQ/Ci0gIGVsc2UKLQotICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0gICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAotICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgotICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZHN0YXJnIjsgdGhlbgotICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGRzdD0kZHN0YXJnCi0gICAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgotICAgIGNhc2UgJGRzdCBpbgotICAgICAgLSopIGRzdD0uLyRkc3QgOzsKLSAgICBlc2FjCi0KLSAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCi0gICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KLSAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCi0JZWNobyAiJDA6ICRkc3Rhcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgICBkc3RkaXI9JGRzdAotICAgICAgZHN0PSRkc3RkaXIvYGJhc2VuYW1lICIkc3JjImAKLSAgICAgIGRzdGRpcl9zdGF0dXM9MAotICAgIGVsc2UKLSAgICAgICMgUHJlZmVyIGRpcm5hbWUsIGJ1dCBmYWxsIGJhY2sgb24gYSBzdWJzdGl0dXRlIGlmIGRpcm5hbWUgZmFpbHMuCi0gICAgICBkc3RkaXI9YAotCShkaXJuYW1lICIkZHN0IikgMj4vZGV2L251bGwgfHwKLQlleHByIFgiJGRzdCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgICAgIFgiJGRzdCIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgICAgIFgiJGRzdCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgICAgIFgiJGRzdCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0JZWNobyBYIiRkc3QiIHwKLQkgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkJICAgcy8vXDEvCi0JCSAgIHEKLQkJIH0KLQkJIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkJICAgcy8vXDEvCi0JCSAgIHEKLQkJIH0KLQkJIC9eWFwoXC9cL1wpJC97Ci0JCSAgIHMvL1wxLwotCQkgICBxCi0JCSB9Ci0JCSAvXlhcKFwvXCkuKi97Ci0JCSAgIHMvL1wxLwotCQkgICBxCi0JCSB9Ci0JCSBzLy4qLy4vOyBxJwotICAgICAgYAotCi0gICAgICB0ZXN0IC1kICIkZHN0ZGlyIgotICAgICAgZHN0ZGlyX3N0YXR1cz0kPwotICAgIGZpCi0gIGZpCi0KLSAgb2Jzb2xldGVfbWtkaXJfdXNlZD1mYWxzZQotCi0gIGlmIHRlc3QgJGRzdGRpcl9zdGF0dXMgIT0gMDsgdGhlbgotICAgIGNhc2UgJHBvc2l4X21rZGlyIGluCi0gICAgICAnJykKLQkjIENyZWF0ZSBpbnRlcm1lZGlhdGUgZGlycyB1c2luZyBtb2RlIDc1NSBhcyBtb2RpZmllZCBieSB0aGUgdW1hc2suCi0JIyBUaGlzIGlzIGxpa2UgRnJlZUJTRCAnaW5zdGFsbCcgYXMgb2YgMTk5Ny0xMC0yOC4KLQl1bWFzaz1gdW1hc2tgCi0JY2FzZSAkc3RyaXBjbWQuJHVtYXNrIGluCi0JICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KLQkgICpbMjM2N11bMjM2N10pIG1rZGlyX3VtYXNrPSR1bWFzazs7Ci0JICAuKjBbMDJdWzAyXSB8IC5bMDJdWzAyXSB8IC5bMDJdKSBta2Rpcl91bWFzaz0yMjs7Ci0KLQkgICpbMC03XSkKLQkgICAgbWtkaXJfdW1hc2s9YGV4cHIgJHVtYXNrICsgMjIgXAotCSAgICAgIC0gJHVtYXNrICUgMTAwICUgNDAgKyAkdW1hc2sgJSAyMCBcCi0JICAgICAgLSAkdW1hc2sgJSAxMCAlIDQgKyAkdW1hc2sgJSAyCi0JICAgIGA7OwotCSAgKikgbWtkaXJfdW1hc2s9JHVtYXNrLGdvLXc7OwotCWVzYWMKLQotCSMgV2l0aCAtZCwgY3JlYXRlIHRoZSBuZXcgZGlyZWN0b3J5IHdpdGggdGhlIHVzZXItc3BlY2lmaWVkIG1vZGUuCi0JIyBPdGhlcndpc2UsIHJlbHkgb24gJG1rZGlyX3VtYXNrLgotCWlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgotCSAgbWtkaXJfbW9kZT0tbSRtb2RlCi0JZWxzZQotCSAgbWtkaXJfbW9kZT0KLQlmaQotCi0JcG9zaXhfbWtkaXI9ZmFsc2UKLQljYXNlICR1bWFzayBpbgotCSAgKlsxMjM1NjddWzAtN11bMC03XSkKLQkgICAgIyBQT1NJWCBta2RpciAtcCBzZXRzIHUrd3ggYml0cyByZWdhcmRsZXNzIG9mIHVtYXNrLCB3aGljaAotCSAgICAjIGlzIGluY29tcGF0aWJsZSB3aXRoIEZyZWVCU0QgJ2luc3RhbGwnIHdoZW4gKHVtYXNrICYgMzAwKSAhPSAwLgotCSAgICA7OwotCSAgKikKLQkgICAgdG1wZGlyPSR7VE1QRElSLS90bXB9L2lucyRSQU5ET00tJCQKLQkgICAgdHJhcCAncmV0PSQ/OyBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIgMj4vZGV2L251bGw7IGV4aXQgJHJldCcgMAotCi0JICAgIGlmICh1bWFzayAkbWtkaXJfdW1hc2sgJiYKLQkJZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkdG1wZGlyL2QiKSA+L2Rldi9udWxsIDI+JjEKLQkgICAgdGhlbgotCSAgICAgIGlmIHRlc3QgLXogIiRkaXJfYXJnIiB8fCB7Ci0JCSAgICMgQ2hlY2sgZm9yIFBPU0lYIGluY29tcGF0aWJpbGl0aWVzIHdpdGggLW0uCi0JCSAgICMgSFAtVVggMTEuMjMgYW5kIElSSVggNi41IG1rZGlyIC1tIC1wIHNldHMgZ3JvdXAtIG9yCi0JCSAgICMgb3RoZXItd3JpdGVhYmxlIGJpdCBvZiBwYXJlbnQgZGlyZWN0b3J5IHdoZW4gaXQgc2hvdWxkbid0LgotCQkgICAjIEZyZWVCU0QgNi4xIG1rZGlyIC1tIC1wIHNldHMgbW9kZSBvZiBleGlzdGluZyBkaXJlY3RvcnkuCi0JCSAgIGxzX2xkX3RtcGRpcj1gbHMgLWxkICIkdG1wZGlyImAKLQkJICAgY2FzZSAkbHNfbGRfdG1wZGlyIGluCi0JCSAgICAgZD8/Pz8tP3ItKikgZGlmZmVyZW50X21vZGU9NzAwOzsKLQkJICAgICBkPz8/Py0/LS0qKSBkaWZmZXJlbnRfbW9kZT03NTU7OwotCQkgICAgICopIGZhbHNlOzsKLQkJICAgZXNhYyAmJgotCQkgICAkbWtkaXJwcm9nIC1tJGRpZmZlcmVudF9tb2RlIC1wIC0tICIkdG1wZGlyIiAmJiB7Ci0JCSAgICAgbHNfbGRfdG1wZGlyXzE9YGxzIC1sZCAiJHRtcGRpciJgCi0JCSAgICAgdGVzdCAiJGxzX2xkX3RtcGRpciIgPSAiJGxzX2xkX3RtcGRpcl8xIgotCQkgICB9Ci0JCSB9Ci0JICAgICAgdGhlbiBwb3NpeF9ta2Rpcj06Ci0JICAgICAgZmkKLQkgICAgICBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIKLQkgICAgZWxzZQotCSAgICAgICMgUmVtb3ZlIGFueSBkaXJzIGxlZnQgYmVoaW5kIGJ5IGFuY2llbnQgbWtkaXIgaW1wbGVtZW50YXRpb25zLgotCSAgICAgIHJtZGlyIC4vJG1rZGlyX21vZGUgLi8tcCAuLy0tIDI+L2Rldi9udWxsCi0JICAgIGZpCi0JICAgIHRyYXAgJycgMDs7Ci0JZXNhYzs7Ci0gICAgZXNhYwotCi0gICAgaWYKLSAgICAgICRwb3NpeF9ta2RpciAmJiAoCi0JdW1hc2sgJG1rZGlyX3VtYXNrICYmCi0JJGRvaXRfZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkZHN0ZGlyIgotICAgICAgKQotICAgIHRoZW4gOgotICAgIGVsc2UKLQotICAgICAgIyBUaGUgdW1hc2sgaXMgcmlkaWN1bG91cywgb3IgbWtkaXIgZG9lcyBub3QgY29uZm9ybSB0byBQT1NJWCwKLSAgICAgICMgb3IgaXQgZmFpbGVkIHBvc3NpYmx5IGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uLiAgQ3JlYXRlIHRoZQotICAgICAgIyBkaXJlY3RvcnkgdGhlIHNsb3cgd2F5LCBzdGVwIGJ5IHN0ZXAsIGNoZWNraW5nIGZvciByYWNlcyBhcyB3ZSBnby4KLQotICAgICAgY2FzZSAkZHN0ZGlyIGluCi0JLyopIHByZWZpeD0vIDs7Ci0JLSopIHByZWZpeD0uLyA7OwotCSopICBwcmVmaXg9IDs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgJHBvc2l4X2dsb2IgaW4KLSAgICAgICAgJycpCi0JICBpZiAoc2V0IC1mKSAyPi9kZXYvbnVsbDsgdGhlbgotCSAgICBwb3NpeF9nbG9iPXRydWUKLQkgIGVsc2UKLQkgICAgcG9zaXhfZ2xvYj1mYWxzZQotCSAgZmkgOzsKLSAgICAgIGVzYWMKLQotICAgICAgb0lGUz0kSUZTCi0gICAgICBJRlM9LwotICAgICAgJHBvc2l4X2dsb2IgJiYgc2V0IC1mCi0gICAgICBzZXQgZm5vcmQgJGRzdGRpcgotICAgICAgc2hpZnQKLSAgICAgICRwb3NpeF9nbG9iICYmIHNldCArZgotICAgICAgSUZTPSRvSUZTCi0KLSAgICAgIHByZWZpeGVzPQotCi0gICAgICBmb3IgZAotICAgICAgZG8KLQl0ZXN0IC16ICIkZCIgJiYgY29udGludWUKLQotCXByZWZpeD0kcHJlZml4JGQKLQlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgotCSAgcHJlZml4ZXM9Ci0JZWxzZQotCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCi0JICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKLQkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCi0JICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCi0JICBlbHNlCi0JICAgIGNhc2UgJHByZWZpeCBpbgotCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKLQkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OwotCSAgICBlc2FjCi0JICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKLQkgIGZpCi0JZmkKLQlwcmVmaXg9JHByZWZpeC8KLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgotCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkodW1hc2sgJG1rZGlyX3VtYXNrICYmCi0JIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8Ci0JICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKLQlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgotICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCi0gICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAotICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQotICBlbHNlCi0KLSAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXwotICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXwotCi0gICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KLSAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKLQotICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCi0gICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKLQotICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KLSAgICAjCi0gICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLSAgICAjCi0gICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKLQotICAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLSAgICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3QiIDI+L2Rldi9udWxsIFwKLSAgICAgIHx8IHsKLQkgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCi0JICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKLQkgICAjIHN1cHBvcnQgLWYuCi0KLQkgICAjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCi0JICAgIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKLQkgICAjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCi0JICAgIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3Ci0JICAgIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KLQkgICB7Ci0JICAgICBpZiB0ZXN0IC1mICIkZHN0IjsgdGhlbgotCSAgICAgICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIFwKLQkgICAgICAgfHwgeyAkZG9pdCAkbXZjbWQgLWYgIiRkc3QiICIkcm10bXAiIDI+L2Rldi9udWxsIFwKLQkJICAgICAmJiB7ICRkb2l0ICRybWNtZCAtZiAiJHJtdG1wIiAyPi9kZXYvbnVsbDsgOjsgfTsgfVwKLQkgICAgICAgfHwgewotCQkgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgotCQkgKGV4aXQgMSk7IGV4aXQgMQotCSAgICAgICB9Ci0JICAgICBlbHNlCi0JICAgICAgIDoKLQkgICAgIGZpCi0JICAgfSAmJgotCi0JICAgIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCSAgICRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCi0JIH0KLSAgICB9IHx8IGV4aXQgMQotCi0gICAgdHJhcCAnJyAwCi0gIGZpCi1kb25lCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvbWlzc2luZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnByb3h5L21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjOGZmNzAuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvbWlzc2luZworKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMDYtMDUtMTAuMjMKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgT3JpZ2luYWxseSBieSBGcmFuLGNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSMgMDIxMTAtMTMwMSwgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gIGV4aXQgMQotZmkKLQotcnVuPToKLXNlZF9vdXRwdXQ9J3MvLiogLS1vdXRwdXRbID1dXChbXiBdKlwpLiovXDEvcCcKLXNlZF9taW51c289J3MvLiogLW8gXChbXiBdKlwpLiovXDEvcCcKLQotIyBJbiB0aGUgY2FzZXMgd2hlcmUgdGhpcyBtYXR0ZXJzLCBgbWlzc2luZycgaXMgYmVpbmcgcnVuIGluIHRoZQotIyBzcmNkaXIgYWxyZWFkeS4KLWlmIHRlc3QgLWYgY29uZmlndXJlLmFjOyB0aGVuCi0gIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuYWMKLWVsc2UKLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5pbgotZmkKLQotbXNnPSJtaXNzaW5nIG9uIHlvdXIgc3lzdGVtIgotCi1jYXNlICQxIGluCi0tLXJ1bikKLSAgIyBUcnkgdG8gcnVuIHJlcXVlc3RlZCBwcm9ncmFtLCBhbmQganVzdCBleGl0IGlmIGl0IHN1Y2NlZWRzLgotICBydW49Ci0gIHNoaWZ0Ci0gICIkQCIgJiYgZXhpdCAwCi0gICMgRXhpdCBjb2RlIDYzIG1lYW5zIHZlcnNpb24gbWlzbWF0Y2guICBUaGlzIG9mdGVuIGhhcHBlbnMKLSAgIyB3aGVuIHRoZSB1c2VyIHRyeSB0byB1c2UgYW4gYW5jaWVudCB2ZXJzaW9uIG9mIGEgdG9vbCBvbgotICAjIGEgZmlsZSB0aGF0IHJlcXVpcmVzIGEgbWluaW11bSB2ZXJzaW9uLiAgSW4gdGhpcyBjYXNlIHdlCi0gICMgd2Ugc2hvdWxkIHByb2NlZWQgaGFzIGlmIHRoZSBwcm9ncmFtIGhhZCBiZWVuIGFic2VudCwgb3IKLSAgIyBpZiAtLXJ1biBoYWRuJ3QgYmVlbiBwYXNzZWQuCi0gIGlmIHRlc3QgJD8gPSA2MzsgdGhlbgotICAgIHJ1bj06Ci0gICAgbXNnPSJwcm9iYWJseSB0b28gb2xkIgotICBmaQotICA7OwotCi0gIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKLSAgICBlY2hvICJcCi0kMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KLQotSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgotZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgotCi1PcHRpb25zOgotICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gIC0tcnVuICAgICAgICAgICB0cnkgdG8gcnVuIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgZW11bGF0ZSBpdCBpZiBpdCBmYWlscwotCi1TdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6Ci0gIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKLSAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCi0gIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCi0gIGF1dG9tNHRlICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUsIG9yIGNyZWF0ZSBhIHN0dWIgb25lCi0gIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKLSAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQotICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBoZWxwMm1hbiAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgdGFyICAgICAgICAgIHRyeSB0YXIsIGdudXRhciwgZ3RhciwgdGhlbiB0YXIgd2l0aG91dCBub24tcG9ydGFibGUgZmxhZ3MKLSAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQotCi1TZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKLSAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC0qKQotICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgotICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICBleGl0IDEKLSAgICA7OwotCi1lc2FjCi0KLSMgTm93IGV4aXQgaWYgd2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4gIEFsc28gZXhpdCBub3cgaWYgd2UKLSMgZG9uJ3QgaGF2ZSBpdCBhbmQgLS12ZXJzaW9uIHdhcyBwYXNzZWQgKG1vc3QgbGlrZWx5IHRvIGRldGVjdAotIyB0aGUgcHJvZ3JhbSkuCi1jYXNlICQxIGluCi0gIGxleHx5YWNjKQotICAgICMgTm90IEdOVSBwcm9ncmFtcywgdGhleSBkb24ndCBoYXZlIC0tdmVyc2lvbi4KLSAgICA7OwotCi0gIHRhcikKLSAgICBpZiB0ZXN0IC1uICIkcnVuIjsgdGhlbgotICAgICAgIGVjaG8gMT4mMiAiRVJST1I6IFxgdGFyJyByZXF1aXJlcyAtLXJ1biIKLSAgICAgICBleGl0IDEKLSAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgotICAgICAgIGV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KLSAgICAgICAjIENvdWxkIG5vdCBydW4gLS12ZXJzaW9uIG9yIC0taGVscC4gIFRoaXMgaXMgcHJvYmFibHkgc29tZW9uZQotICAgICAgICMgcnVubmluZyBgJFRPT0wgLS12ZXJzaW9uJyBvciBgJFRPT0wgLS1oZWxwJyB0byBjaGVjayB3aGV0aGVyCi0gICAgICAgIyAkVE9PTCBleGlzdHMgYW5kIG5vdCBrbm93aW5nICRUT09MIHVzZXMgbWlzc2luZy4KLSAgICAgICBleGl0IDEKLSAgICBmaQotICAgIDs7Ci1lc2FjCi0KLSMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCi0jIHRyeSB0byBlbXVsYXRlIGl0LgotY2FzZSAkMSBpbgotICBhY2xvY2FsKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQotICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGFjbG9jYWwubTQKLSAgICA7OwotCi0gIGF1dG9jb25mKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUKLSAgICAgICAgIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VCi0gICAgICAgICBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGNvbmZpZ3VyZQotICAgIDs7Ci0KLSAgYXV0b2hlYWRlcikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KLSAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyAke2NvbmZpZ3VyZV9hY31gCi0gICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCi0gICAgdG91Y2hfZmlsZXM9Ci0gICAgZm9yIGYgaW4gJGZpbGVzOyBkbwotICAgICAgY2FzZSAkZiBpbgotICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKLQkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7Ci0gICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIHRvdWNoICR0b3VjaF9maWxlcwotICAgIDs7Ci0KLSAgYXV0b21ha2UqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBhdXRvbTR0ZSkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCi0gICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAotICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKLSAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIjISAvYmluL3NoIgotCWVjaG8gIiMgQ3JlYXRlZCBieSBHTlUgQXV0b21ha2UgbWlzc2luZyBhcyBhIHJlcGxhY2VtZW50IG9mIgotCWVjaG8gIiMgICQgJEAiCi0JZWNobyAiZXhpdCAwIgotCWNobW9kICt4ICRmaWxlCi0JZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gIGJpc29ufHlhY2MpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAotICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAkTEFTVEFSRyBpbgotCSoueSkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCi0JICAgIGZpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCi0JICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgotCWVjaG8gPnkudGFiLmgKLSAgICBmaQotICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCi0gICAgZmkKLSAgICA7OwotCi0gIGxleHxmbGV4KQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC5sJyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEZsZXgnIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgRmxleCcgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgbGV4Lnl5LmMKLSAgICBpZiB0ZXN0ICQjIC1uZSAxOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgJExBU1RBUkcgaW4KLQkqLmwpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCi0JICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgdGVzdCAhIC1mIGxleC55eS5jOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBoZWxwMm1hbikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCi0JIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQotCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAotICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKLSAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBtYWtlaW5mbykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICAjIFRoZSBmaWxlIHRvIHRvdWNoIGlzIHRoYXQgc3BlY2lmaWVkIHdpdGggLW8gLi4uCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotICAgICAgIyAuLi4gb3IgaXQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgd2l0aCBAc2V0ZmlsZW5hbWUgLi4uCi0gICAgICBpbmZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnCi0JL15Ac2V0ZmlsZW5hbWUvewotCSAgcy8uKiBcKFteIF0qXCkgKiQvXDEvCi0JICBwCi0JICBxCi0JfScgJGluZmlsZWAKLSAgICAgICMgLi4uIG9yIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIG5hbWUgKGRpci9mLnRleGkgYmVjb21lcyBmLmluZm8pCi0gICAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJGluZmlsZSIgfCBzZWQgJ3MsLiovLCw7cywuW14uXSokLCwnYC5pbmZvCi0gICAgZmkKLSAgICAjIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgdXNlciByZWFsbHkgbmVlZHMgbWFrZWluZm87Ci0gICAgIyBsZXQncyBmYWlsIHdpdGhvdXQgdG91Y2hpbmcgYW55dGhpbmcuCi0gICAgdGVzdCAtZiAkZmlsZSB8fCBleGl0IDEKLSAgICB0b3VjaCAkZmlsZQotICAgIDs7Ci0KLSAgdGFyKQotICAgIHNoaWZ0Ci0KLSAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KLSAgICAjIExvb2sgZm9yIGdudXRhci9ndGFyIGJlZm9yZSBpbnZvY2F0aW9uIHRvIGF2b2lkIHVnbHkgZXJyb3IKLSAgICAjIG1lc3NhZ2VzLgotICAgIGlmIChnbnV0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgICAgZ251dGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBndGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBmaXJzdGFyZz0iJDEiCi0gICAgaWYgc2hpZnQ7IHRoZW4KLQljYXNlICRmaXJzdGFyZyBpbgotCSpvKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLQljYXNlICRmaXJzdGFyZyBpbgotCSpoKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KLSAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCi0gICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZwotICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKLSAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9zcmMvcHRwX3Bic19wcm94eS5jIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMucHJveHkvc3JjL3B0cF9wYnNfcHJveHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNWZjOC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy5wcm94eS9zcmMvcHRwX3Bic19wcm94eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY1NyArMCwwIEBACi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxyZWdleC5oPgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0KLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X3RjcC5oIgotI2luY2x1ZGUgImhhbmRsZXIuaCIKLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgImFyZ3MuaCIKLSNpbmNsdWRlICJyYW5nZXNldC5oIgotI2luY2x1ZGUgInBic19pZmwuaCIKLQotI2RlZmluZSBXSVJFX1BST1RPQ09MX1ZFUlNJT04JIjIuMCIKLQotLyoKLSAqIFBCUyBSZXNvdXJjZXMKLSAqCi0gKiBhcmNoCQkJc3RyaW5nCQlTeXN0ZW0gYXJjaGl0ZWN0dXJlCi0gKiBjcHV0CQkJdGltZQkJTWF4aW11bSwgYWdncmVnYXRlIENQVSB0aW1lIHJlcXVpcmVkIGJ5IGFsbCBwcm9jZXNzZXMKLSAqIGZpbGUJCQlzaXplCQlNYXhpbXVtIGRpc2sgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBhbnkgc2luZ2xlIGZpbGUgdG8gYmUgY3JlYXRlZAotICogaG9zdAkJCXN0cmluZwkJTmFtZSBvZiByZXF1ZXN0ZWQgaG9zdC9ub2RlCi0gKiBtZW0JCQlzaXplCQlNYXhpbXVtIGFtb3VudCBvZiBwaHlzaWNhbCBtZW1vcnkgKFJBTSkKLSAqIG1waXByb2NzCQlpbnQJCQlOdW1iZXIgb2YgTVBJIHByb2Nlc3NlcyBmb3IgdGhpcyBjaHVuawotICogbmNwdXMJCWludAkJCU51bWJlciBvZiBDUFVzIChwcm9jZXNzb3JzKQotICogbmljZQkJCWludAkJCVJlcXVlc3RlZCBqb2IgcHJpb3JpdHkKLSAqIG5vZGVzCQlzdHJpbmcJCU51bWJlciBhbmQvb3IgdHlwZSBvZiBub2RlcwotICogbm9kZWN0CQlpbnQJCQlOdW1iZXIgb2YgY2h1bmtzIGluIHJlc291cmNlIHJlcXVlc3QgZnJvbSBzZWxlY3Rpb24gZGlyZWN0aXZlLCBvciBudW1iZXIgb2Ygdm5vZGVzIHJlcXVlc3RlZCBmcm9tIG5vZGUgc3BlY2lmaWNhdGlvbgotICogb21wdGhyZWFkcwlpbnQJCQlOdW1iZXIgb2YgT3Blbk1QIHRocmVhZHMgZm9yIHRoaXMgY2h1bmsuCi0gKiBwY3B1dAkJdGltZQkJUGVyLXByb2Nlc3MgbWF4aW11bSBDUFUgdGltZQotICogcG1lbQkJCXNpemUJCVBlci1wcm9jZXNzIG1heGltdW0gYW1vdW50IG9mIHBoeXNpY2FsIG1lbW9yeQotICogcHZtZW0JCXNpemUJCVBlci1wcm9jZXNzIG1heGltdW0gYW1vdW50IG9mIHZpcnR1YWwgbWVtb3J5Ci0gKiByZXNjCQkJc3RyaW5nCQlTaW5nbGUtbm9kZSB2YXJpYWJsZSByZXNvdXJjZSBzcGVjaWZpY2F0aW9uIHN0cmluZwotICogdm1lbQkJCXNpemUJCU1heGltdW0sIGFnZ3JlZ2F0ZSBhbW91bnQgb2YgdmlydHVhbCBtZW1vcnkgdXNlZCBieSBhbGwgY29uY3VycmVudCBwcm9jZXNzZXMKLSAqIHdhbGx0aW1lCQl0aW1lCQlNYXhpbXVtIGFtb3VudCBvZiByZWFsIHRpbWUgKHdhbGwtY2xvY2sgZWxhcHNlZCB0aW1lKQotICogbXBwZQkJCWludAkJCVRoZSBudW1iZXIgb2YgcHJvY2Vzc2luZyBlbGVtZW50cyB1c2VkIGJ5IGEgc2luZ2xlIHByb2Nlc3MKLSAqIG1wcHQJCQl0aW1lCQlNYXhpbXVtIHdhbGxjbG9jayB0aW1lIHVzZWQgb24gdGhlIE1QUC4KLSAqIHBmCQkJc2l6ZQkJTWF4aW11bSBudW1iZXIgb2YgZmlsZSBzeXN0ZW0gYmxvY2tzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYWxsIHByb2Nlc3MKLSAqIHBtcHB0CQl0aW1lCQlNYXhpbXVtIGFtb3VudCBvZiB3YWxsIGNsb2NrIHRpbWUgdXNlZCBvbiB0aGUgTVBQIGJ5IGEgc2luZ2xlIHByb2Nlc3MKLSAqIHBuY3B1cwkJaW50CQkJTWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29ycyB1c2VkIGJ5IGFueSBzaW5nbGUgcHJvY2VzcwotICogcHBmCQkJc2l6ZQkJTWF4aW11bSBudW1iZXIgb2YgZmlsZSBzeXN0ZW0gYmxvY2tzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBzaW5nbGUgcHJvY2VzcwotICogcHJvY3MJCWludAkJCU1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NlcwotICogcHNkcwkJCXNpemUJCU1heGltdW0gbnVtYmVyIG9mIGRhdGEgYmxvY2tzIG9uIHRoZSBTRFMgKHNlY29uZGFyeSBkYXRhIHN0b3JhZ2UpIGZvciBhbnkgcHJvY2VzcwotICogc2RzCQkJc2l6ZQkJTWF4aW11bSBudW1iZXIgb2YgZGF0YSBibG9ja3Mgb24gdGhlIFNEUyAoc2Vjb25kYXJ5IGRhdGEgc3RvcmFnZSkKLSAqCi0gKiBKb2IgQXR0cmlidXRlcwotICoKLSAqIEFjY291bnRfTmFtZQotICogQ2hlY2twb2ludAotICogZGVwZW5kCi0gKiBFcnJvcl9QYXRoCi0gKiBFeGVjdXRpb25fVGltZQotICogZ3JvdXBfbGlzdAotICogSG9sZF9UeXBlcwotICogSm9iX05hbWUKLSAqIEpvaW5fUGF0aAotICogS2VlcF9GaWxlcwotICogTWFpbF9Qb2ludHMKLSAqIE1haWxfVXNlcnMKLSAqIG5vX3N0ZGlvX3NvY2tldHMKLSAqIE91dHB1dF9QYXRoCi0gKiBQcmlvcml0eQotICogUmVydW5uYWJsZQotICogUmVzb3VyY2VfTGlzdFsucmVzb3VyY2VdCi0gKiBTaGVsbF9QYXRoX0xpc3QKLSAqIHN0YWdlaW4KLSAqIHN0YWdlb3V0Ci0gKiB1bWFzawotICogVXNlcl9MaXN0Ci0gKiBWYXJpYWJsZV9MaXN0Ci0gKiBjb21tZW50Ci0gKgotICogUmVhZC1vbmx5IEpvYiBBdHRyaWJ1dGVzCi0gKgotICogYWNjb3VudGluZ19pZAotICogYWx0X2lkCi0gKiBhcnJheQotICogYXJyYXlfaWQKLSAqIGFycmF5X2luZGV4Ci0gKiBhcnJheV9pbmRpY2VzX3JlbWFpbmluZwotICogYXJyYXlfaW5kaWNlc19zdWJtaXR0ZWQKLSAqIGFycmF5X3N0YXRlX2NvdW50Ci0gKiBjdGltZQotICogZXRpbWUKLSAqIGV4ZWNfaG9zdAotICogZWdyb3VwCi0gKiBldXNlcgotICogaGFzaG5hbWUKLSAqIGludGVyYWN0aXZlCi0gKiBKb2JfT3duZXIKLSAqIGpvYl9zdGF0ZQotICogbXRpbWUKLSAqIHF0aW1lCi0gKiBxdWV1ZQotICogcmVzb3VyY2VzX3VzZWQKLSAqIHJ1bl9jb3VudAotICogc2NoZWRzZWxlY3QKLSAqIHNlcnZlcgotICogc2Vzc2lvbl9pZAotICoKLSAqIFF1ZXVlIEF0dHJpYnV0ZXMKLSAqIGFjbF9ncm91cHMJCQlzdHJpbmcJIiIJCVRoZSBsaXN0IG9mIGdyb3VwcyB3aGljaCBtYXkgc3VibWl0IGpvYnMgdG8gdGhlIHF1ZXVlCi0gKiBhY2xfZ3JvdXBfZW5hYmxlIAlib29sZWFuCWZhbHNlCU9ubHkgYWxsb3cgam9icyBzdWJtaXR0ZWQgZnJvbSBncm91cHMgc3BlY2lmaWVkIGJ5IHRoZSBhY2xfZ3JvdXBzIHBhcmFtZXRlcgotICogYWNsX2dyb3VwX3Nsb3BweQkJYm9vbGVhbglmYWxzZQlhY2xfZ3JvdXBzIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCBncm91cHMgb2Ygd2hpY2ggdGhlIGpvYiB1c2VyIGlzIGEgbWVtYmVyCi0gKiBhY2xfaG9zdHMJCQlzdHJpbmcJIiIJCUxpc3Qgb2YgaG9zdHMgdGhhdCBtYXkgc3VibWl0IGpvYnMgdG8gdGhlIHF1ZXVlCi0gKiBhY2xfaG9zdF9lbmFibGUJCWJvb2xlYW4JZmFsc2UJT25seSBhbGxvdyBqb2JzIHN1Ym1pdHRlZCBmcm9tIGhvc3RzIHNwZWNpZmllZCBieSB0aGUgYWNsX2hvc3RzIHBhcmFtZXRlcgotICogYWNsX2xvZ2ljX29yCQkJYm9vbGVhbglmYWxzZQlVc2VyIGFuZCBncm91cCBhY2xzIGFyZSBsb2dpY2FsbHkgT1InZCB0b2dldGhlcgotICogYWNsX3VzZXJzCQkJc3RyaW5nCSIiCQlUaGUgbGlzdCBvZiB1c2VycyB3aG8gbWF5IHN1Ym1pdCBqb2JzIHRvIHRoZSBxdWV1ZQotICogYWNsX3VzZXJfZW5hYmxlCQlib29sZWFuCWZhbHNlCU9ubHkgYWxsb3cgam9icyBzdWJtaXR0ZWQgZnJvbSB1c2VycyBzcGVjaWZpZWQgYnkgdGhlIGFjbF91c2VycyBwYXJhbWV0ZXIKLSAqIGRpc2FsbG93ZWRfdHlwZXMJCXN0cmluZwkiIgkJTGlzdCBvZiBqb2IgInR5cGVzIiB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHF1ZXVlCi0gKiBlbmFibGVkCQkJCWJvb2xlYW4JZmFsc2UgCVRoZSBxdWV1ZSBhY2NlcHRzIG5ldyBqb2Igc3VibWlzc2lvbnMKLSAqIGtlZXBfY29tcGxldGVkCQlpbnRlZ2VyCTAJCVRoZSBudW1iZXIgb2Ygc2Vjb25kcyBqb2JzIHNob3VsZCBiZSBoZWxkIGluIHRoZSBDb21wbGV0ZWQgc3RhdGUgYWZ0ZXIgZXhpdGluZwotICoga2lsbF9kZWxheQkJCWludGVnZXIJMgkJVGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc2VuZGluZyBhIFNJR1RFUk0gYW5kIGEgU0lHS0lMTCB0byBhIGpvYiBiZWluZyBjYW5jZWxsZWQKLSAqIG1heF9xdWV1YWJsZQkJCWludGVnZXIJK0lORglUaGUgbWF4aW11bSBudW1iZXIgb2Ygam9icyBhbGxvd2VkIGluIHRoZSBxdWV1ZSBhdCBhbnkgZ2l2ZW4gdGltZQotICogbWF4X3J1bm5pbmcJCQlpbnRlZ2VyCStJTkYJVGhlIG1heGltdW0gbnVtYmVyIG9mIGpvYnMgaW4gdGhlIHF1ZXVlIGFsbG93ZWQgdG8gcnVuIGF0IGFueSBnaXZlbiB0aW1lCi0gKiBtYXhfdXNlcl9xdWV1YWJsZQlpbnRlZ2VyCStJTkYJVGhlIG1heGltdW0gbnVtYmVyIG9mIGpvYnMsIHBlciB1c2VyLCBhbGxvd2VkIGluIHRoZSBxdWV1ZSBhdCBhbnkgZ2l2ZW4gdGltZQotICogbWF4X3VzZXJfcnVuCQkJaW50ZWdlcgkrSU5GCVRoZSBtYXhpbXVtIG51bWJlciBvZiBqb2JzLCBwZXIgdXNlciwgaW4gdGhlIHF1ZXVlIGFsbG93ZWQgdG8gcnVuIGF0IGFueSBnaXZlbiB0aW1lCi0gKiBwcmlvcml0eQkJCQlpbnRlZ2VyCStJTkYJVGhlIHByaW9yaXR5IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcXVldWUuICBERUZBVUxUOiAwCXFtZ3IgLWMgInNldCBxdWV1ZSBiYXRjaCBwcmlvcml0eT0yMCIKLSAqIHF1ZXVlX3R5cGUJCQllbnVtCWUJIAlUaGUgcXVldWUgdHlwZSAoZT1leGVjdXRpb24sIHI9cm91dGUpCi0gKiByZXNvdXJjZXNfYXZhaWxhYmxlCXN0cmluZwkiIgkJVGhlIGN1bXVsYXRpdmUgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBhbGwgam9icyBydW5uaW5nIGluIHRoZSBxdWV1ZQotICogcmVzb3VyY2VzX2RlZmF1bHQJc3RyaW5nCSIiCQlEZWZhdWx0IHJlc291cmNlIHJlcXVpcmVtZW50cyBmb3Igam9icyBzdWJtaXR0ZWQgdG8gdGhlIHF1ZXVlCi0gKiByZXNvdXJjZXNfbWF4CQlzdHJpbmcJIiIJCVRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0cyBmb3Igam9icyBzdWJtaXR0ZWQgdG8gdGhlIHF1ZXVlCi0gKiByZXNvdXJjZXNfbWluCQlzdHJpbmcJIiIJCVRoZSBtaW5pbXVtIHJlc291cmNlIGxpbWl0cyBmb3Igam9icyBzdWJtaXR0ZWQgdG8gdGhlIHF1ZXVlCi0gKiByb3V0ZV9kZXN0aW5hdGlvbnMJc3RyaW5nCSIiCQlUaGUgcG90ZW50aWFsIGRlc3RpbmF0aW9uIHF1ZXVlcyBmb3Igam9icyBzdWJtaXR0ZWQgdG8gdGhlIGFzc29jaWF0ZWQgcm91dGluZyBxdWV1ZQotICogc3RhcnRlZAkJCQlib29sZWFuCWZhbHNlCUpvYnMgaW4gdGhlIHF1ZXVlIGFyZSBhbGxvd2VkIHRvIGV4ZWN1dGUKLSAqLwotLyoKLSAqIFByb3h5IHNlcnZlciBzdGF0ZXMuIFRoZSBTSFVUVElOR19ET1dOIHN0YXRlIGlzIHVzZWQgdG8KLSAqIGdpdmUgdGhlIHByb3h5IGEgY2hhbmNlIHRvIHNlbmQgYW55IHBlbmRpbmcgZXZlbnRzIG9uY2UKLSAqIGEgUVVJVCBjb21tYW5kIGhhcyBiZWVuIHJlY2VpdmVkLgotICovCi0jZGVmaW5lIFNUQVRFX0lOSVQJCQkwCi0jZGVmaW5lIFNUQVRFX1JVTk5JTkcJCTEKLSNkZWZpbmUgU1RBVEVfU0hVVFRJTkdfRE9XTgkyCi0jZGVmaW5lIFNUQVRFX1NIVVRET1dOCQkzCi0KLS8qCi0gKiBSVEVWIGNvZGVzIG11c3QgRVhBQ1RMWSBtYXRjaCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50Ci0gKi8KLSNkZWZpbmUgUlRFVl9PRkZTRVQJCQkJCQkyMDAKLQotLyoKLSAqIFJURVZfRVJST1IgY29kZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgUEJTIHNwZWNpZmljIHBsdWdpbgotICovCi0jZGVmaW5lIFJURVZfRVJST1JfSU5JVAkJCVJURVZfT0ZGU0VUICsgMTAwMAotI2RlZmluZSBSVEVWX0VSUk9SX0ZJTkFMSVpFCQlSVEVWX09GRlNFVCArIDEwMDEKLSNkZWZpbmUgUlRFVl9FUlJPUl9TVUJNSVQJCVJURVZfT0ZGU0VUICsgMTAwMgotI2RlZmluZSBSVEVWX0VSUk9SX0pPQgkJCVJURVZfT0ZGU0VUICsgMTAwMwotI2RlZmluZSBSVEVWX0VSUk9SX1NFUlZFUgkJUlRFVl9PRkZTRVQgKyAxMDA0Ci0jZGVmaW5lIFJURVZfRVJST1JfTkFUVFIJCVJURVZfT0ZGU0VUICsgMTAwNwotI2RlZmluZSBSVEVWX0VSUk9SX1NJR05BTAkJUlRFVl9PRkZTRVQgKyAxMDA5Ci0jZGVmaW5lIFJURVZfRVJST1JfRklMVEVSCQlSVEVWX09GRlNFVCArIDEwMTAKLSNkZWZpbmUgUlRFVl9FUlJPUl9TVEFSVF9FVkVOVFMJUlRFVl9PRkZTRVQgKyAxMDExCi0KLSNkZWZpbmUgSk9CX05BTUVfRk1UCQkJImpvYiUwMmQiCi0jZGVmaW5lIFBCU19RVUVVRV9BVFRSCQkJInF1ZXVlIgotI2RlZmluZSBQQlNfUE9MTF9JTlRFUlZBTAkJNjAwMDAwMDAgLyogNjAgc2Vjb25kcyAqLwotI2RlZmluZSBQUk9YWV9USU1FT1VUCQkJMjAwMDAJIC8qIDIwIG1zICovCi0KLSNkZWZpbmUgREVGQVVMVF9IQVNIX1NJWkUJCQkJODE5MgotI2RlZmluZSBERUZBVUxUX0ZJTFRFUl9IQVNIX1NJWkUJCTMyCi0jZGVmaW5lIERFRkFVTFRfRklMVEVSX0FUVFJfSEFTSF9TSVpFCTMyCi0jZGVmaW5lIERFRkFVTFRfSE9TVAkJCQkJImxvY2FsaG9zdCIKLSNkZWZpbmUgREVGQVVMVF9QUk9YWQkJCQkJInRjcCIKLQotaW50IFBCU19Jbml0aWFsaXplKGludCwgaW50LCBjaGFyICoqKTsKLWludCBQQlNfTW9kZWxEZWYoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IFBCU19TdGFydEV2ZW50cyhpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgUEJTX1N0b3BFdmVudHMoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IFBCU19TdWJtaXRKb2IoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IFBCU19UZXJtaW5hdGVKb2IoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IFBCU19RdWl0KGludCwgaW50LCBjaGFyICoqKTsKLWludCBQQlNfRmlsdGVyRXZlbnRzKGludCwgaW50LCBjaGFyICoqKTsKLQotZW51bSBqb2Jfc3RhdGUgewotCUpPQl9DUkVBVEVELAotCUpPQl9OT1JNQUwsCi0JSk9CX1RFUk1JTkFUSU5HLAotCUpPQl9URVJNSU5BVEVECi19OwotdHlwZWRlZiBlbnVtIGpvYl9zdGF0ZQlqb2Jfc3RhdGU7Ci0KLXN0cnVjdCBwdHBfbWFjaGluZSB7Ci0JaW50CQlpZDsKLQljaGFyICoJbmFtZTsKLQlMaXN0ICoJbm9kZXM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHRwX21hY2hpbmUJcHRwX21hY2hpbmU7Ci0KLXN0cnVjdCBwdHBfbm9kZSB7Ci0JaW50CSAJaWQ7Ci0JaW50CQludW1iZXI7Ci0JY2hhciAqCW5hbWU7Ci0JY2hhciAqCXN0YXRlOwotCWNoYXIgKgl1c2VyOwotCWNoYXIgKglncm91cDsKLQljaGFyICoJbW9kZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBwdHBfbm9kZQlwdHBfbm9kZTsKLQotc3RydWN0IHB0cF9wcm9jZXNzIHsKLQlpbnQJCWlkOwotCWludAkJbm9kZV9pZDsKLQlpbnQJCXRhc2tfaWQ7Ci0JaW50CQlwaWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHRwX3Byb2Nlc3MJcHRwX3Byb2Nlc3M7Ci0KLXN0cnVjdCBwdHBfcXVldWUgewotCWludAkJaWQ7Ci0JY2hhciAqCW5hbWU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHRwX3F1ZXVlIHB0cF9xdWV1ZTsKLQotc3RydWN0IHB0cF9qb2IgewotCWludCAJCQlwdHBfam9iaWQ7CQkvKiBqb2IgSUQgYXMga25vd24gYnkgUFRQICovCi0JY2hhciAqIAkJCXBic19qb2JpZDsJCS8qIFBCUyBqb2IgSUQgKi8KLQljaGFyICoJCQlqb2JzdWJpZDsJCS8qIHN1Ym1pc3Npb24gSUQgb2Ygam9iICovCi0JcHRwX3F1ZXVlICoJCXF1ZXVlOwkJCS8qIHF1ZXVlIHRoaXMgam9iIGlzIGluICovCi0JaW50CQkJCW51bV9wcm9jczsJCS8qIG51bWJlciBvZiBwcm9jcyByZXF1ZXN0ZWQgZm9yIHByb2dyYW0gKGRlYnVnZ2VyIHVzZXMgbnVtX3Byb2NzKzEpICovCi0JYm9vbAkJCWRlYnVnOwkJCS8qIGpvYiBpcyBkZWJ1ZyBqb2IgKi8KLQlqb2Jfc3RhdGUJCXN0YXRlOwkJCS8qIGpvYiBzdGF0ZSAqLwotCWJvb2wJCQlpb2Y7CQkJLyogam9iIGhhcyBpL28gZm9yd2FyZGluZyAqLwotCXB0cF9wcm9jZXNzICoqCXByb2NzOwkJCS8qIHByb2NzIGZvciB0aGlzIGpvYiAqLwotCXJhbmdlc2V0ICoJCXNldDsJCQkvKiByYW5nZSBzZXQgb2YgcHJvYyBJRHMgKi8KLX07Ci10eXBlZGVmIHN0cnVjdCBwdHBfam9iIHB0cF9qb2I7Ci0KLXN0cnVjdCBwdHBfZmlsdGVyIHsKLQlIYXNoICoJaGFzaDsJCS8qIGF0dHJpYnV0ZXMgdG8gZmlsdGVyICovCi0JaW50CQludW1fYXR0cnM7CS8qIG51bWJlciBvZiBhdHRyaWJ1dGVzIGluIGhhc2ggKi8KLQlib29sCWNoaWxkcmVuOwkvKiBhcHBseSBmaWx0ZXIgdG8gY2hpbGRyZW4gKi8KLX07Ci10eXBlZGVmIHN0cnVjdCBwdHBfZmlsdGVyCXB0cF9maWx0ZXI7Ci0KLXN0YXRpYyBpbnQJCQlnVHJhbnNJRCA9IDA7IC8qIHRyYW5zYWN0aW9uIGlkIGZvciBzdGFydCBvZiBldmVudCBzdHJlYW0sIGlzIDAgd2hlbiBldmVudHMgYXJlIG9mZiAqLwotc3RhdGljIGludAkJCWdCYXNlSUQgPSAtMTsgLyogYmFzZSBJRCBmb3IgZXZlbnQgZ2VuZXJhdGlvbiAqLwotc3RhdGljIGludAkJCWdMYXN0SUQgPSAxOyAvKiBJRCBnZW5lcmF0b3IgKi8KLXN0YXRpYyBpbnQgCQkJcHJveHlfc3RhdGUgPSBTVEFURV9JTklUOwotc3RhdGljIHByb3h5X3N2ciAqCWNvbm47Ci1zdGF0aWMgTGlzdCAqCQlnSm9iTGlzdDsKLXN0YXRpYyBIYXNoICoJCWdKb2JIYXNoOwotc3RhdGljIEhhc2ggKgkJZ0ZpbHRlcnM7Ci1zdGF0aWMgTGlzdCAqCQlnTWFjaGluZUxpc3Q7Ci1zdGF0aWMgTGlzdCAqCQlnUXVldWVMaXN0Owotc3RhdGljIGludAkJCXB0cF9zaWduYWxfZXhpdDsKLXN0YXRpYyBpbnQJCQlkZWJ1Z19sZXZlbCA9IDA7IC8qIDAgaXMgb2ZmICovCi1zdGF0aWMgUkVUU0lHVFlQRQkoKnNhdmVkX3NpZ25hbHNbTlNJR10pKGludCk7Ci1zdGF0aWMgaW50CQkJc3RyZWFtOwotc3RhdGljIGNoYXIgKgkJZ1VzZXJOYW1lOwotCi1leHRlcm4gY2hhciAqCQlwYnNfc2VydmVyOwotCi1zdGF0aWMgcHJveHlfc3ZyX2hlbHBlcl9mdW5jcyBoZWxwZXJfZnVuY3MgPSB7Ci0JTlVMTCwJCQkJCS8vIG5ld2Nvbm4oKSAtIGNhbiBiZSB1c2VkIHRvIHJlamVjdCBjb25uZWN0aW9ucwotCU5VTEwJCQkJCS8vIG51bXNlcnZlcnMoKSAtIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2ZXJzLCByZXR1cm4gdGhlIG51bWJlcgotfTsKLQotI2RlZmluZSBDTURfQkFTRQkwCi0KLXN0YXRpYyBwcm94eV9jbWQJY21kc1tdID0gewotCVBCU19RdWl0LAotCVBCU19Jbml0aWFsaXplLAotCVBCU19Nb2RlbERlZiwKLQlQQlNfU3RhcnRFdmVudHMsCi0JUEJTX1N0b3BFdmVudHMsCi0JUEJTX1N1Ym1pdEpvYiwKLQlQQlNfVGVybWluYXRlSm9iLAotCVBCU19GaWx0ZXJFdmVudHMKLX07Ci0KLXN0YXRpYyBwcm94eV9jb21tYW5kcyBjb21tYW5kX3RhYiA9IHsKLQlDTURfQkFTRSwKLQlzaXplb2YoY21kcykvc2l6ZW9mKHByb3h5X2NtZCksCi0JY21kcwotfTsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLQl7InByb3h5IiwJCQlyZXF1aXJlZF9hcmd1bWVudCwJTlVMTCwgCSdQJ30sIAotCXsicG9ydCIsCQkJcmVxdWlyZWRfYXJndW1lbnQsCU5VTEwsIAkncCd9LCAKLQl7Imhvc3QiLAkJCXJlcXVpcmVkX2FyZ3VtZW50LAlOVUxMLCAJJ2gnfSwgCi0JeyJkZWJ1ZyIsCQkJcmVxdWlyZWRfYXJndW1lbnQsCU5VTEwsIAknZCd9LCAKLQl7TlVMTCwJCQkJMCwJCQkJCU5VTEwsCTB9Ci19OwotCi0vKgotICogR2VuZXJhdGUgYSBtb2RlbCBlbGVtZW50IElECi0gKi8KLXN0YXRpYyBpbnQKLWdlbmVyYXRlX2lkKHZvaWQpCi17Ci0JcmV0dXJuIGdCYXNlSUQgKyBnTGFzdElEKys7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBuZXcgbWFjaGluZS4KLSAqLwotc3RhdGljIHB0cF9tYWNoaW5lICoKLW5ld19tYWNoaW5lKGNoYXIgKm5hbWUpCi17Ci0JcHRwX21hY2hpbmUgKgltID0gKHB0cF9tYWNoaW5lICopbWFsbG9jKHNpemVvZihwdHBfbWFjaGluZSkpOwotCW0tPmlkID0gZ2VuZXJhdGVfaWQoKTsKLQltLT5uYW1lID0gc3RyZHVwKG5hbWUpOwotCW0tPm5vZGVzID0gTmV3TGlzdCgpOwotICAgIEFkZFRvTGlzdChnTWFjaGluZUxpc3QsICh2b2lkICopbSk7Ci0gICAgcmV0dXJuIG07Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX21hY2hpbmUocHRwX21hY2hpbmUgKm0pCi17Ci0JUmVtb3ZlRnJvbUxpc3QoZ01hY2hpbmVMaXN0LCAodm9pZCAqKW0pOwotCWZyZWUobS0+bmFtZSk7Ci0JZnJlZShtKTsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBub2RlLgotICovCi1zdGF0aWMgcHRwX25vZGUgKgotbmV3X25vZGUocHRwX21hY2hpbmUgKm1hY2gsIGNoYXIgKm5hbWUsIGNoYXIgKnN0YXRlLCBjaGFyICp1c2VyLCBjaGFyICpncm91cCwgY2hhciAqbW9kZSkKLXsKLQlzdGF0aWMgaW50IG5vZGVfbnVtYmVyID0gMDsKLQlwdHBfbm9kZSAqCW4gPSAocHRwX25vZGUgKiltYWxsb2Moc2l6ZW9mKHB0cF9ub2RlKSk7Ci0JCi0JbWVtc2V0KChjaGFyICopbiwgMCwgc2l6ZW9mKHB0cF9ub2RlKSk7Ci0Jbi0+aWQgPSBnZW5lcmF0ZV9pZCgpOwotCW4tPm51bWJlciA9IG5vZGVfbnVtYmVyKys7Ci0JaWYgKG5hbWUgIT0gTlVMTCkKLQkJbi0+bmFtZSA9IHN0cmR1cChuYW1lKTsKLQlpZiAoc3RhdGUgIT0gTlVMTCkKLQkJbi0+c3RhdGUgPSBzdHJkdXAoc3RhdGUpOwotCWlmICh1c2VyICE9IE5VTEwpCi0JCW4tPnVzZXIgPSBzdHJkdXAodXNlcik7Ci0JaWYgKGdyb3VwICE9IE5VTEwpCi0JCW4tPmdyb3VwID0gc3RyZHVwKGdyb3VwKTsKLQlpZiAobW9kZSAhPSBOVUxMKQotCQluLT5tb2RlID0gc3RyZHVwKG1vZGUpOwotICAgIEFkZFRvTGlzdChtYWNoLT5ub2RlcywgKHZvaWQgKiluKTsKLSAgICByZXR1cm4gbjsKLX0KLQotLyoKLSAqIFZlcnkgZXhwZW5zaXZlIQotICovCi1zdGF0aWMgcHRwX25vZGUgKgotZmluZF9ub2RlX2J5X25hbWUoY2hhciAqbmFtZSkKLXsKLQlwdHBfbWFjaGluZSAqCW07Ci0JcHRwX25vZGUgKgkJbjsKLQkKLQlmb3IgKFNldExpc3QoZ01hY2hpbmVMaXN0KTsgKG0gPSAocHRwX21hY2hpbmUgKilHZXRMaXN0RWxlbWVudChnTWFjaGluZUxpc3QpKSAhPSBOVUxMOyApIHsKLQkJZm9yIChTZXRMaXN0KG0tPm5vZGVzKTsgKG4gPSAocHRwX25vZGUgKilHZXRMaXN0RWxlbWVudChtLT5ub2RlcykpICE9IE5VTEw7ICkgewotCQkJaWYgKHN0cmNtcChuYW1lLCBuLT5uYW1lKSA9PSAwKQotCQkJCXJldHVybiBuOwotCQl9Ci0JfQotCQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogQ3JlYXRlIGEgbmV3IHByb2Nlc3MuCi0gKi8KLXN0YXRpYyBwdHBfcHJvY2VzcyAqCi1uZXdfcHJvY2VzcyhwdHBfam9iICpqb2IsIGludCBub2RlX2lkLCBpbnQgdGFza19pZCwgaW50IHBpZCkKLXsKLQlwdHBfcHJvY2VzcyAqCXAgPSAocHRwX3Byb2Nlc3MgKiltYWxsb2Moc2l6ZW9mKHB0cF9wcm9jZXNzKSk7Ci0JcC0+aWQgPSBnZW5lcmF0ZV9pZCgpOwotCXAtPm5vZGVfaWQgPSBub2RlX2lkOwotCXAtPnRhc2tfaWQgPSB0YXNrX2lkOwotCXAtPnBpZCA9IHBpZDsKLSAgICBqb2ItPnByb2NzW3Rhc2tfaWRdID0gcDsKLSAgICBpbnNlcnRfaW5fcmFuZ2VzZXQoam9iLT5zZXQsIHAtPmlkKTsKLSAgICByZXR1cm4gcDsKLX0KLQotc3RhdGljIHZvaWQKLWZyZWVfcHJvY2VzcyhwdHBfcHJvY2VzcyAqcCkKLXsKLQlmcmVlKHApOwotfQotCi1zdGF0aWMgcHRwX3Byb2Nlc3MgKgotZmluZF9wcm9jZXNzKHB0cF9qb2IgKmpvYiwgaW50IHRhc2tfaWQpCi17Ci0JaWYgKHRhc2tfaWQgPCAwIHx8IHRhc2tfaWQgPj0gam9iLT5udW1fcHJvY3MpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGpvYi0+cHJvY3NbdGFza19pZF07Ci19Ci0KLXN0YXRpYyBwdHBfcXVldWUgKgotbmV3X3F1ZXVlKGNoYXIgKm5hbWUpIHsKLQlwdHBfcXVldWUgKglxID0gKHB0cF9xdWV1ZSAqKW1hbGxvYyhzaXplb2YocHRwX3F1ZXVlKSk7Ci0JcS0+aWQgPSBnZW5lcmF0ZV9pZCgpOwotCXEtPm5hbWUgPSBzdHJkdXAobmFtZSk7Ci0JQWRkVG9MaXN0KGdRdWV1ZUxpc3QsICh2b2lkICopcSk7Ci0JcmV0dXJuIHE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX3F1ZXVlKHB0cF9xdWV1ZSAqcSkKLXsKLQlmcmVlKHEtPm5hbWUpOwotCWZyZWUocSk7Ci19Ci0KLXN0YXRpYyBwdHBfcXVldWUgKgotZmluZF9xdWV1ZV9ieV9pZChpbnQgaWQpCi17Ci0JcHRwX3F1ZXVlICoJcTsKLQotCWZvciAoU2V0TGlzdChnUXVldWVMaXN0KTsgKHEgPSAocHRwX3F1ZXVlICopR2V0TGlzdEVsZW1lbnQoZ1F1ZXVlTGlzdCkpICE9IE5VTEw7ICkgewotCQlpZiAocS0+aWQgPT0gaWQpIHsKLQkJCXJldHVybiBxOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgcHRwX3F1ZXVlICoKLWZpbmRfcXVldWVfYnlfbmFtZShjaGFyICpuYW1lKQotewotCXB0cF9xdWV1ZSAqCXE7Ci0KLQlmb3IgKFNldExpc3QoZ1F1ZXVlTGlzdCk7IChxID0gKHB0cF9xdWV1ZSAqKUdldExpc3RFbGVtZW50KGdRdWV1ZUxpc3QpKSAhPSBOVUxMOyApIHsKLQkJaWYgKHN0cmNtcChxLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlyZXR1cm4gcTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEZpbmQgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlIGZyb20gdGhlIFBCUyBqb2IgYXR0cmlidXRlcwotICovCi1zdGF0aWMgY2hhciAqCi1maW5kX3Bic19xdWV1ZV9uYW1lKHN0cnVjdCBhdHRybCAqYXR0cnMpCi17Ci0Jc3RydWN0IGF0dHJsICphdHRyOwotCi0JZm9yIChhdHRyID0gYXR0cnM7IGF0dHIgIT0gTlVMTDsgYXR0ciA9IGF0dHItPm5leHQpIHsKLQkJaWYgKHN0cmNtcChhdHRyLT5uYW1lLCBQQlNfUVVFVUVfQVRUUikgPT0gMCkgewotCQkJcmV0dXJuIGF0dHItPnZhbHVlOwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBLZWVwIGEgbGlzdCBvZiB0aGUgam9icyB0aGF0IHdlIGhhdmUgY3JlYXRlZC4gSWYgdGhleSBhcmUKLSAqIGRlYnVnIGpvYnMsIGtlZXAgdGhlIGRlYnVnIGpvYmlkIGFzIHdlbGwuCi0gKi8KLXN0YXRpYyBwdHBfam9iICoKLW5ld19qb2IoaW50IG51bV9wcm9jcywgYm9vbCBkZWJ1ZywgcHRwX3F1ZXVlICpxdWV1ZSwgY2hhciAqam9ic3ViaWQsIGNoYXIgKnBic19qb2JpZCkKLXsKLQlwdHBfam9iICoJaiA9IChwdHBfam9iICopbWFsbG9jKHNpemVvZihwdHBfam9iKSk7Ci0Jai0+cXVldWUgPSBxdWV1ZTsKLQlqLT5wdHBfam9iaWQgPSBnZW5lcmF0ZV9pZCgpOwotCWotPnBic19qb2JpZCA9IHN0cmR1cChwYnNfam9iaWQpOwotCWotPmpvYnN1YmlkID0gTlVMTDsKLQlpZiAoam9ic3ViaWQgIT0gTlVMTCkgewotCQlqLT5qb2JzdWJpZCA9IHN0cmR1cChqb2JzdWJpZCk7Ci0JfQotICAgIGotPm51bV9wcm9jcyA9IDA7Ci0gICAgai0+cHJvY3MgPSBOVUxMOwotICAgIGotPmRlYnVnID0gZGVidWc7Ci0gICAgai0+c3RhdGUgPSBKT0JfQ1JFQVRFRDsKLSAgICBqLT5pb2YgPSBmYWxzZTsKLSAgICBqLT5zZXQgPSBuZXdfcmFuZ2VzZXQoKTsKLSAgICAvL2otPnByb2NzID0gKHB0cF9wcm9jZXNzICoqKW1hbGxvYyhzaXplb2YocHRwX3Byb2Nlc3MgKikgKiBudW1fcHJvY3MpOwotICAgIC8vbWVtc2V0KGotPnByb2NzLCAwLCBzaXplb2YocHRwX3Byb2Nlc3MgKikgKiBudW1fcHJvY3MpOwotICAgIEFkZFRvTGlzdChnSm9iTGlzdCwgKHZvaWQgKilqKTsKLSAgICBIYXNoSW5zZXJ0KGdKb2JIYXNoLCBIYXNoQ29tcHV0ZShwYnNfam9iaWQsIHN0cmxlbihwYnNfam9iaWQpKSwgKHZvaWQgKilqKTsKLSAgICByZXR1cm4gajsKLX0KLQotc3RhdGljIHZvaWQKLWZyZWVfam9iKHB0cF9qb2IgKmopCi17Ci0JaW50CWk7Ci0JCi0JUmVtb3ZlRnJvbUxpc3QoZ0pvYkxpc3QsICh2b2lkICopaik7Ci0JSGFzaFJlbW92ZShnSm9iSGFzaCwgSGFzaENvbXB1dGUoai0+cGJzX2pvYmlkLCBzdHJsZW4oai0+cGJzX2pvYmlkKSkpOwotCWZyZWUoai0+cGJzX2pvYmlkKTsKLQlmcmVlKGotPmpvYnN1YmlkKTsKLQlmb3IgKGkgPSAwOyBpIDwgai0+bnVtX3Byb2NzOyBpKyspIHsKLQkJaWYgKGotPnByb2NzW2ldICE9IE5VTEwpCi0JCQlmcmVlX3Byb2Nlc3Moai0+cHJvY3NbaV0pOwotCX0KLQlpZiAoai0+cHJvY3MgIT0gTlVMTCkgewotCQlmcmVlKGotPnByb2NzKTsKLQl9Ci0JZnJlZV9yYW5nZXNldChqLT5zZXQpOwotCWZyZWUoaik7Ci19Ci0KLS8qCi0gKiBGaW5kIGEgam9iIG9uIHRoZSBsaXN0IHVzaW5nIHRoZSBQVFAgam9iIElECi0gKi8KLXN0YXRpYyBwdHBfam9iICoKLWZpbmRfam9iX2J5X2lkKGludCBqb2JpZCkKLXsKLQlwdHBfam9iICoJajsKLQkKLQlmb3IgKFNldExpc3QoZ0pvYkxpc3QpOyAoaiA9IChwdHBfam9iICopR2V0TGlzdEVsZW1lbnQoZ0pvYkxpc3QpKSAhPSBOVUxMOyApIHsKLQkJaWYgKGotPnB0cF9qb2JpZCA9PSBqb2JpZCkgewotCQkJcmV0dXJuIGo7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9wYnNfYXR0cl9jb3VudChzdHJ1Y3QgYXR0cmwgKmF0dHJzKQotewotCWludCAJCQljb3VudCA9IDA7Ci0Jc3RydWN0IGF0dHJsICoJYXR0cjsKLQotCWZvciAoYXR0ciA9IGF0dHJzOyBhdHRyICE9IE5VTEw7IGF0dHIgPSBhdHRyLT5uZXh0KSB7Ci0JCWNvdW50Kys7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgdm9pZAotYWRkX3Bic19hdHRyaWJ1dGVzKHByb3h5X21zZyAqbSwgc3RydWN0IGF0dHJsICphdHRycykKLXsKLQlzdHJ1Y3QgYXR0cmwgKmF0dHI7Ci0KLQlmb3IgKGF0dHIgPSBhdHRyczsgYXR0ciAhPSBOVUxMOyBhdHRyID0gYXR0ci0+bmV4dCkgewotCQlwcm94eV9hZGRfc3RyaW5nX2F0dHJpYnV0ZShtLCBhdHRyLT5uYW1lLCBhdHRyLT52YWx1ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotc2h1dGRvd25fcGJzKCkKLXsKLQlwYnNfZGlzY29ubmVjdChzdHJlYW0pOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE9LRXZlbnQoaW50IHRyYW5zX2lkKQotewotCXByb3h5X3N2cl9xdWV1ZV9tc2coY29ubiwgcHJveHlfb2tfZXZlbnQodHJhbnNfaWQpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRTaHV0ZG93bkV2ZW50KGludCB0cmFuc19pZCkKLXsKLQlwcm94eV9zdnJfcXVldWVfbXNnKGNvbm4sIHByb3h5X3NodXRkb3duX2V2ZW50KHRyYW5zX2lkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTWVzc2FnZUV2ZW50KGludCB0cmFuc19pZCwgY2hhciAqbGV2ZWwsIGludCBjb2RlLCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0CQlhcDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coY29ubiwgcHJveHlfbWVzc2FnZV9ldmVudCh0cmFuc19pZCwgbGV2ZWwsIGNvZGUsIGZtdCwgYXApKTsKLQl2YV9lbmQoYXApOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZEVycm9yRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgY29kZSwgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdAkJYXA7Ci0KLQl2YV9zdGFydChhcCwgZm10KTsKLQlpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAic2VuZEVycm9yRXZlbnQoJWQsICVkLCAiLCB0cmFuc19pZCwgY29kZSk7Ci0JCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiKVxuIik7Ci0JCWZmbHVzaChzdGRlcnIpOwotCX0KLQlwcm94eV9zdnJfcXVldWVfbXNnKGNvbm4sIHByb3h5X2Vycm9yX2V2ZW50KHRyYW5zX2lkLCBjb2RlLCBmbXQsIGFwKSk7Ci0JdmFfZW5kKGFwKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRKb2JTdWJFcnJvckV2ZW50KGludCB0cmFuc19pZCwgY2hhciAqam9iU3ViSWQsIGNoYXIgKm1zZykKLXsKLQlwcm94eV9zdnJfcXVldWVfbXNnKGNvbm4sIHByb3h5X3N1Ym1pdGpvYl9lcnJvcl9ldmVudCh0cmFuc19pZCwgam9iU3ViSWQsIFJURVZfRVJST1JfU1VCTUlULCBtc2cpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRKb2JUZXJtaW5hdGVFcnJvckV2ZW50KGludCB0cmFuc19pZCwgaW50IGlkLCBjaGFyICptc2cpCi17Ci0JY2hhciAqCWpvYl9pZDsKLQkKLQlhc3ByaW50Zigmam9iX2lkLCAiJWQiLCBpZCk7Ci0JCi0JcHJveHlfc3ZyX3F1ZXVlX21zZyhjb25uLCBwcm94eV90ZXJtaW5hdGVqb2JfZXJyb3JfZXZlbnQodHJhbnNfaWQsIGpvYl9pZCwgUlRFVl9FUlJPUl9KT0IsIG1zZykpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE5ld01hY2hpbmVFdmVudChpbnQgdHJhbnNfaWQsIGludCBpZCwgY2hhciAqbmFtZSkKLXsKLQljaGFyICoJcm1faWQ7Ci0JY2hhciAqCW1hY2hpbmVfaWQ7Ci0JCi0JYXNwcmludGYoJnJtX2lkLCAiJWQiLCBnQmFzZUlEKTsJCi0JYXNwcmludGYoJm1hY2hpbmVfaWQsICIlZCIsIGlkKTsJCi0JCi0JcHJveHlfc3ZyX3F1ZXVlX21zZyhjb25uLCBwcm94eV9uZXdfbWFjaGluZV9ldmVudCh0cmFuc19pZCwgcm1faWQsIG1hY2hpbmVfaWQsIG5hbWUsIE1BQ0hJTkVfU1RBVEVfVVApKTsKLQkKLQlmcmVlKG1hY2hpbmVfaWQpOwotCWZyZWUocm1faWQpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE5ld1F1ZXVlRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgaWQsIGNoYXIgKm5hbWUsIHN0cnVjdCBhdHRybCAqYXR0cnMpCi17Ci0JY2hhciAqCQlybV9pZDsKLQljaGFyICoJCXF1ZXVlX2lkOwotCXByb3h5X21zZyAqCW07Ci0KLQlhc3ByaW50Zigmcm1faWQsICIlZCIsIGdCYXNlSUQpOwotCWFzcHJpbnRmKCZxdWV1ZV9pZCwgIiVkIiwgaWQpOwotCi0JbSA9IHByb3h5X25ld19xdWV1ZV9ldmVudCh0cmFuc19pZCwgcm1faWQsIHF1ZXVlX2lkLCBuYW1lLCBRVUVVRV9TVEFURV9OT1JNQUwsIGdldF9wYnNfYXR0cl9jb3VudChhdHRycykpOwotCWFkZF9wYnNfYXR0cmlidXRlcyhtLCBhdHRycyk7Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhjb25uLCBtKTsKLQotCWZyZWUocXVldWVfaWQpOwotCWZyZWUocm1faWQpOwotfQotCi1zdGF0aWMgaW50Ci1udW1fbm9kZV9hdHRycyhwdHBfbm9kZSAqbm9kZSkKLXsKLQlpbnQJY250ID0gMDsKLQlpZiAobm9kZS0+bnVtYmVyID49IDApCi0JCWNudCsrOwotCXJldHVybiBjbnQ7CQotfQotCi0vKgotICogTk9URTogc2VuZGluZyBhIE5PREVfTlVNQkVSX0FUVFIgd2lsbCBlbmFibGUgdGhlIG5vZGUgbnVtYmVyIHJ1bGVyIGluIHRoZSBtYWNoaW5lcyB2aWV3LgotICovCi1zdGF0aWMgdm9pZAotYWRkX25vZGVfYXR0cnMocHJveHlfbXNnICptLCBwdHBfbm9kZSAqbm9kZSkKLXsKLQlpZiAobm9kZS0+bnVtYmVyID49IDApCi0JCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG0sIE5PREVfTlVNQkVSX0FUVFIsIG5vZGUtPm51bWJlcik7Ci19Ci0KLXN0YXRpYyBwdHBfZmlsdGVyICoKLW5ld19maWx0ZXIoKQotewotCXB0cF9maWx0ZXIgKglmID0gKHB0cF9maWx0ZXIgKiltYWxsb2Moc2l6ZW9mKHB0cF9maWx0ZXIpKTsKLQotCWYtPmhhc2ggPSBIYXNoQ3JlYXRlKERFRkFVTFRfRklMVEVSX0FUVFJfSEFTSF9TSVpFKTsKLQlmLT5udW1fYXR0cnMgPSAwOwotCWYtPmNoaWxkcmVuID0gZmFsc2U7Ci0KLQlyZXR1cm4gZjsKLX0KLQotc3RhdGljIHZvaWQKLWFkZF9maWx0ZXJfYXR0cmlidXRlKHB0cF9maWx0ZXIgKmYsIGNoYXIgKmF0dHIpCi17Ci0JY2hhciAqCW5hbWUgPSBwcm94eV9jb3B5X2F0dHJpYnV0ZV9uYW1lX2ZpbHRlcihhdHRyKTsKLQljaGFyICoJdmFsdWUgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhdHRyKTsKLQotCWlmIChuYW1lICE9IE5VTEwgJiYgdmFsdWUgIT0gTlVMTCkgewotCQlyZWdleF90ICoJcmVnID0gKHJlZ2V4X3QgKiltYWxsb2Moc2l6ZW9mKHJlZ2V4X3QpKTsKLQkJaW50IGlkeCA9IEhhc2hDb21wdXRlKG5hbWUsIHN0cmxlbihuYW1lKSk7Ci0JCWlmIChyZWdjb21wKHJlZywgdmFsdWUsIFJFR19FWFRFTkRFRHxSRUdfTk9TVUIpID09IDApIHsKLQkJCUhhc2hJbnNlcnQoZi0+aGFzaCwgaWR4LCByZWcpOwotCQkJZi0+bnVtX2F0dHJzKys7Ci0JCX0gZWxzZSB7Ci0JCQlmcmVlKHJlZyk7Ci0JCX0KLQkJZnJlZShuYW1lKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX2ZpbHRlcihwdHBfZmlsdGVyICpmKQotewotCUhhc2hEZXN0cm95KGYtPmhhc2gsIGZyZWUpOwotCWZyZWUoZik7Ci19Ci0KLXN0YXRpYyBib29sCi1tYXRjaF9maWx0ZXJfc3RyKGludCBpZCwgYm9vbCBpc19jaGlsZCwgc3RydWN0IGF0dHJsICphdHRycykKLXsKLQlzdHJ1Y3QgYXR0cmwgKglhdHRyOwotCXB0cF9maWx0ZXIgKglmID0gKHB0cF9maWx0ZXIgKilIYXNoU2VhcmNoKGdGaWx0ZXJzLCBpZCk7Ci0KLQlpZiAoZiAhPSBOVUxMICYmIChmLT5jaGlsZHJlbiB8ICFpc19jaGlsZCkpIHsKLQkJZm9yIChhdHRyID0gYXR0cnM7IGF0dHIgIT0gTlVMTDsgYXR0ciA9IGF0dHItPm5leHQpIHsKLQkJCXJlZ2V4X3QJKglyZWcgPSAocmVnZXhfdCAqKUhhc2hGaW5kKGYtPmhhc2gsIGF0dHItPm5hbWUpOwotCQkJaWYgKHJlZyAhPSBOVUxMICYmIHJlZ2V4ZWMocmVnLCBhdHRyLT52YWx1ZSwgMCwgTlVMTCwgMCkgIT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi12b2lkCi11cGRhdGVfZmlsdGVyKGludCBpZCwgcHRwX2ZpbHRlciAqbmYpCi17Ci0JcHRwX2ZpbHRlciAqCWYgPSAocHRwX2ZpbHRlciAqKUhhc2hTZWFyY2goZ0ZpbHRlcnMsIGlkKTsKLQotCWlmIChmICE9IE5VTEwpIHsKLQkJLyoKLQkJICogSWYgbm8gYXR0cmlidXRlcyBzcGVjaWZpZWQsIHJlbW92ZSBleGlzdGluZyBmaWx0ZXIgb3RoZXJ3aXNlCi0JCSAqIHJlbW92ZSBjdXJyZW50IGZpbHRlciBhbmQgcmVwbGFjZSB3aXRoIG5ldwotCQkgKi8KLQkJSGFzaFJlbW92ZShnRmlsdGVycywgaWQpOwotCQlmcmVlX2ZpbHRlcihmKTsKLQotCQlpZiAobmYtPm51bV9hdHRycyA9PSAwKSB7Ci0JCQlmcmVlX2ZpbHRlcihuZik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlIYXNoSW5zZXJ0KGdGaWx0ZXJzLCBpZCwgKHZvaWQgKiluZik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTmV3Sm9iRXZlbnQoaW50IHRyYW5zX2lkLCBwdHBfam9iICpqKQotewotCWNoYXIgKgkJam9iX2lkOwotCWNoYXIgKgkJcXVldWVfaWQ7Ci0JcHJveHlfbXNnICoJbTsKLQotCWFzcHJpbnRmKCZqb2JfaWQsICIlZCIsIGotPnB0cF9qb2JpZCk7Ci0JYXNwcmludGYoJnF1ZXVlX2lkLCAiJWQiLCBqLT5xdWV1ZS0+aWQpOwotCi0JbSA9IHByb3h5X25ld19qb2JfZXZlbnQodHJhbnNfaWQsIHF1ZXVlX2lkLCBqb2JfaWQsIGotPnBic19qb2JpZCwgSk9CX1NUQVRFX0lOSVQsIGotPmpvYnN1YmlkKTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKGNvbm4sIG0pOwotCi0JZnJlZShqb2JfaWQpOwotCWZyZWUocXVldWVfaWQpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE5ld05vZGVFdmVudChpbnQgdHJhbnNfaWQsIGludCBtYWNoaWQsIHB0cF9tYWNoaW5lICptYWNoKQotewotCXB0cF9ub2RlICoJbjsKLQlwcm94eV9tc2cgKgltOwotCWNoYXIgKgkJbWFjaGluZV9pZDsKLQljaGFyICoJCW5vZGVfaWQ7Ci0JCi0JYXNwcmludGYoJm1hY2hpbmVfaWQsICIlZCIsIG1hY2hpZCk7Ci0JCi0JbSA9IHByb3h5X25ld19ub2RlX2V2ZW50KHRyYW5zX2lkLCBtYWNoaW5lX2lkLCBTaXplT2ZMaXN0KG1hY2gtPm5vZGVzKSk7Ci0JCi0JZm9yIChTZXRMaXN0KG1hY2gtPm5vZGVzKTsgKG4gPSAocHRwX25vZGUgKilHZXRMaXN0RWxlbWVudChtYWNoLT5ub2RlcykpICE9IE5VTEw7ICkgewotCQlhc3ByaW50Zigmbm9kZV9pZCwgIiVkIiwgbi0+aWQpOwotCQlwcm94eV9hZGRfbm9kZShtLCBub2RlX2lkLCBuLT5uYW1lLCBuLT5zdGF0ZSwgbnVtX25vZGVfYXR0cnMobikpOwotCQlhZGRfbm9kZV9hdHRycyhtLCBuKTsKLQkJZnJlZShub2RlX2lkKTsKLQl9Ci0JCi0JcHJveHlfc3ZyX3F1ZXVlX21zZyhjb25uLCBtKTsKLQkKLQlmcmVlKG1hY2hpbmVfaWQpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE5ld1Byb2Nlc3NFdmVudChpbnQgdHJhbnNfaWQsIGludCBqb2JpZCwgcHRwX3Byb2Nlc3MgKnAsIGNoYXIgKnN0YXRlKQotewotCXByb3h5X21zZyAqCW07Ci0JY2hhciAqCQlqb2JfaWQ7Ci0JY2hhciAqCQlwcm9jX2lkOwotCWNoYXIgKgkJbmFtZTsKLQkKLQlhc3ByaW50Zigmam9iX2lkLCAiJWQiLCBqb2JpZCk7Ci0JYXNwcmludGYoJnByb2NfaWQsICIlZCIsIHAtPmlkKTsKLQlhc3ByaW50ZigmbmFtZSwgIiVkIiwgIHAtPnRhc2tfaWQpOwotCQotCW0gPSBwcm94eV9uZXdfcHJvY2Vzc19ldmVudCh0cmFuc19pZCwgam9iX2lkLCAxKTsKLQlwcm94eV9hZGRfcHJvY2VzcyhtLCBwcm9jX2lkLCBuYW1lLCBzdGF0ZSwgMyk7Ci0JcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobSwgUFJPQ19OT0RFSURfQVRUUiwgcC0+bm9kZV9pZCk7CQotCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG0sIFBST0NfSU5ERVhfQVRUUiwgcC0+dGFza19pZCk7CQotCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG0sIFBST0NfUElEX0FUVFIsIHAtPnBpZCk7Ci0JCi0JcHJveHlfc3ZyX3F1ZXVlX21zZyhjb25uLCBtKTsKLQkKLQlmcmVlKGpvYl9pZCk7Ci0JZnJlZShwcm9jX2lkKTsKLQlmcmVlKG5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZFByb2Nlc3NTdGF0ZUNoYW5nZUV2ZW50KGludCB0cmFuc19pZCwgcHRwX2pvYiAqaiwgY2hhciAqc3RhdGUpCi17Ci0JcHJveHlfbXNnICoJbTsKLQkKLQlpZiAoaiA9PSBOVUxMIHx8IGotPm51bV9wcm9jcyA9PSAwKQotCQlyZXR1cm47Ci0JCQotCW0gPSBwcm94eV9wcm9jZXNzX2NoYW5nZV9ldmVudCh0cmFuc19pZCwgcmFuZ2VzZXRfdG9fc3RyaW5nKGotPnNldCksIDEpOwotCXByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG0sIFBST0NfU1RBVEVfQVRUUiwgc3RhdGUpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coY29ubiwgbSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kUk1BdHRyaWJ1dGVzRXZlbnQoaW50IHRyYW5zX2lkLCBzdHJ1Y3QgYXR0cmwgKmF0dHIpCi17Ci0JcHJveHlfbXNnICoJbTsKLQljaGFyICpybV9pZDsKLQotCWFzcHJpbnRmKCZybV9pZCwgIiVkIiwgZ0Jhc2VJRCk7Ci0KLQltID0gcHJveHlfcm1fY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCBybV9pZCwgZ2V0X3Bic19hdHRyX2NvdW50KGF0dHIpKTsKLQlhZGRfcGJzX2F0dHJpYnV0ZXMobSwgYXR0cik7Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhjb25uLCBtKTsKLQotCWZyZWUocm1faWQpOwotfQotCQotc3RhdGljIHZvaWQKLXNlbmRKb2JDaGFuZ2VFdmVudChpbnQgdHJhbnNfaWQsIHB0cF9qb2IgKmosIHN0cnVjdCBhdHRybCAqYXR0cnMpCi17Ci0JY2hhciAqCWpvYl9pZDsKLQlwcm94eV9tc2cgKgltOwotCi0JYXNwcmludGYoJmpvYl9pZCwgIiVkIiwgai0+cHRwX2pvYmlkKTsKLQltID0gcHJveHlfam9iX2NoYW5nZV9ldmVudCh0cmFuc19pZCwgam9iX2lkLCBnZXRfcGJzX2F0dHJfY291bnQoYXR0cnMpKTsKLQlhZGRfcGJzX2F0dHJpYnV0ZXMobSwgYXR0cnMpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coY29ubiwgbSk7Ci0JZnJlZShqb2JfaWQpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZEpvYlN0YXRlQ2hhbmdlRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgam9iaWQsIGNoYXIgKnN0YXRlKQotewotCWNoYXIgKgkJam9iX2lkOwotCXByb3h5X21zZyAqCW07Ci0JCi0JYXNwcmludGYoJmpvYl9pZCwgIiVkIiwgam9iaWQpOwotCi0JbSA9IHByb3h5X2pvYl9jaGFuZ2VfZXZlbnQodHJhbnNfaWQsIGpvYl9pZCwgMSk7Ci0JcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUobSwgSk9CX1NUQVRFX0FUVFIsIHN0YXRlKTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKGNvbm4sIG0pOwotCQotCWZyZWUoam9iX2lkKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRQcm9jZXNzQ2hhbmdlRXZlbnQoaW50IHRyYW5zX2lkLCBwdHBfcHJvY2VzcyAqcCwgaW50IG5vZGVfaWQsIGludCB0YXNrX2lkLCBpbnQgcGlkKQotewotCWludAkJCWNudCA9IDA7Ci0JY2hhciAqCQlwcm9jX2lkOwotCXByb3h5X21zZyAqCW07Ci0JCi0JaWYgKHAtPm5vZGVfaWQgIT0gbm9kZV9pZCB8fCBwLT50YXNrX2lkICE9IHRhc2tfaWQgfHwgcC0+cGlkICE9IHBpZCkgewotCQlpZiAocC0+bm9kZV9pZCAhPSBub2RlX2lkKSB7Ci0JCQljbnQrKzsJCi0JCX0KLQkJaWYgKHAtPnRhc2tfaWQgIT0gdGFza19pZCkgewotCQkJY250Kys7CQotCQl9Ci0JCWlmIChwLT5waWQgIT0gcGlkKSB7Ci0JCQljbnQrKzsJCi0JCX0KLQkJCi0JCWFzcHJpbnRmKCZwcm9jX2lkLCAiJWQiLCBwLT5pZCk7Ci0KLQkJbSA9IHByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCBwcm9jX2lkLCBjbnQpOwotCQkKLQkJaWYgKHAtPm5vZGVfaWQgIT0gbm9kZV9pZCkgewotCQkJcC0+bm9kZV9pZCA9IG5vZGVfaWQ7Ci0JCQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtLCBFTEVNRU5UX0lEX0FUVFIsIG5vZGVfaWQpOwkKLQkJfQotCQlpZiAocC0+dGFza19pZCAhPSB0YXNrX2lkKSB7Ci0JCQlwLT50YXNrX2lkID0gdGFza19pZDsKLQkJCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG0sIFBST0NfSU5ERVhfQVRUUiwgdGFza19pZCk7CQotCQl9Ci0JCWlmIChwLT5waWQgIT0gcGlkKSB7Ci0JCQlwLT5waWQgPSBwaWQ7Ci0JCQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtLCBQUk9DX1BJRF9BVFRSLCBwaWQpOwkKLQkJfQotCQkKLQkJcHJveHlfc3ZyX3F1ZXVlX21zZyhjb25uLCBtKTsKLQkJCi0JCWZyZWUocHJvY19pZCk7Ci0JfQotfQotCi0vKgotICogVE9ETzogb3B0aW1pemUgdGhpcyBzbyB0aGF0IHdlIGRvbid0IHNlbmQgb25lIGV2ZW50IGZvcgotICogZXZlcnkgcHJvY2VzcywgZXZlbiBpZiB0aGUgb3V0cHV0IGlzIGlkZW50aWNhbC4KLSAqLwotc3RhdGljIHZvaWQKLXNlbmRQcm9jZXNzT3V0cHV0RXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgcHJvY2lkLCBjaGFyICpvdXRwdXQpCi17Ci0JY2hhciAqCQlwcm9jX2lkOwotCXByb3h5X21zZyAqCW07Ci0JCi0JYXNwcmludGYoJnByb2NfaWQsICIlZCIsIHByb2NpZCk7Ci0JCi0JbSA9IHByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCBwcm9jX2lkLCAxKTsKLQlwcm94eV9hZGRfc3RyaW5nX2F0dHJpYnV0ZShtLCBQUk9DX1NURE9VVF9BVFRSLCBvdXRwdXQpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coY29ubiwgbSk7Ci0JCi0JZnJlZShwcm9jX2lkKTsJCi19Ci0KLS8qCi0gKiBTZXQgaW5pdGlhbCBmaWx0ZXIgb24gcXVldWVzCi0gKi8KLXN0YXRpYyB2b2lkCi1pbml0aWFsaXplX3F1ZXVlX2ZpbHRlcihwdHBfcXVldWUgKnEpCi17Ci0JY2hhciAqCQkJYXR0cjsKLQlwdHBfZmlsdGVyICoJZiA9IG5ld19maWx0ZXIoKTsKLQotCWYtPmNoaWxkcmVuID0gdHJ1ZTsKLQlhc3ByaW50ZigmYXR0ciwgIkpvYl9Pd25lckZpbHRlcj0lc0AuKiIsIGdVc2VyTmFtZSk7Ci0JYWRkX2ZpbHRlcl9hdHRyaWJ1dGUoZiwgYXR0cik7Ci0JdXBkYXRlX2ZpbHRlcihxLT5pZCwgZik7Ci0JZnJlZShhdHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU1RBUlQgT0YgRElTUEFUQ0ggUk9VVElORVMgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotUEJTX0luaXRpYWxpemUoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCQkJCWk7Ci0JcHRwX21hY2hpbmUgKgkJCW1hY2g7Ci0Jc3RydWN0IGJhdGNoX3N0YXR1cyAqCXM7Ci0Jc3RydWN0IGJhdGNoX3N0YXR1cyAqCXN0YXR1czsKLQkKLQlpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUEJTX0luaXRpYWxpemUgKCVkKTpcbiIsIHRyYW5zX2lkKTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCQotCWlmIChwcm94eV9zdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX0lOSVQsICJhbHJlYWR5IGluaXRpYWxpemVkIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCS8qCi0JICogUHJvY2VzcyBhcmd1bWVudHMgZm9yIHRoZSBpbml0IGNvbW1hbmQKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgewotCQlpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoUFJPVE9DT0xfVkVSU0lPTl9BVFRSLCBhcmdzW2ldKSkgewotCQkJaWYgKHN0cmNtcChwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKSwgV0lSRV9QUk9UT0NPTF9WRVJTSU9OKSAhPSAwKSB7Ci0JCQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfSU5JVCwgIndpcmUgcHJvdG9jb2wgdmVyc2lvbiBcIiVzXCIgbm90IHN1cHBvcnRlZCIsIGFyZ3NbMF0pOwotCQkJCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoQkFTRV9JRF9BVFRSLCBhcmdzW2ldKSkgewotCQkJZ0Jhc2VJRCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfaW50KGFyZ3NbaV0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJdCdzIGFuIGVycm9yIGlmIG5vIGJhc2UgSUQgd2FzIHN1cHBsaWVkCi0JICovCi0JaWYgKGdCYXNlSUQgPCAwKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX0lOSVQsICJubyBiYXNlIElEIHN1cHBsaWVkIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCXN0cmVhbSA9IHBic19jb25uZWN0KE5VTEwpOwotCWlmIChzdHJlYW0gPCAwKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX0lOSVQsICJjb3VsZCBub3QgY29ubmVjdCB0byBQQlMgZGFlbW9uIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCi0Jc3RhdHVzID0gcGJzX3N0YXRzZXJ2ZXIoc3RyZWFtLCBOVUxMLCBOVUxMKTsKLQlpZiAoc3RhdHVzID09IE5VTEwpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfSU5JVCwgcGJzX2dldGVycm1zZyhzdHJlYW0pKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgc2VydmVyIG1hY2hpbmUKLQkgKi8KLQltYWNoID0gbmV3X21hY2hpbmUoc3RhdHVzLT5uYW1lKTsKLQotCXBic19zdGF0ZnJlZShzdGF0dXMpOwotCi0JLyoKLQkgKiBHZXQgcXVldWVzIGFuZCBxdWV1ZSBhdHRyaWJ1dGVzCi0JICovCi0Jc3RhdHVzID0gcGJzX3N0YXRxdWUoc3RyZWFtLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoc3RhdHVzID09IE5VTEwpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfSU5JVCwgcGJzX2dldGVycm1zZyhzdHJlYW0pKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0KLQlmb3IgKHM9c3RhdHVzOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KSB7Ci0JCXB0cF9xdWV1ZSAqIHEgPSBuZXdfcXVldWUocy0+bmFtZSk7Ci0JCWluaXRpYWxpemVfcXVldWVfZmlsdGVyKHEpOwotCX0KLQotCXBic19zdGF0ZnJlZShzdGF0dXMpOwotCi0JcHJveHlfc3RhdGUgPSBTVEFURV9SVU5OSU5HOwotCQkKLQlzZW5kT0tFdmVudCh0cmFuc19pZCk7Ci0JCQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKgotICogSW5pdGlhdGUgdGhlIG1vZGVsIGRlZmluaXRpb24gcGhhc2UKLSAqLwotaW50Ci1QQlNfTW9kZWxEZWYoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWlmIChkZWJ1Z19sZXZlbCA+IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJQQlNfTW9kZWxEZWYgKCVkKTpcbiIsIHRyYW5zX2lkKTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCQotCS8qCi0JICogU2VuZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMKLQkgKi8KLQkvKgotCSAqIFNlbmQgZGVmYXVsdCBmaWx0ZXJzCi0JICovCi0Jc2VuZE9LRXZlbnQodHJhbnNfaWQpOwotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKgotICogU3RvcCBwb2xsaW5nIGZvciBMU0YgY2hhbmdlIGV2ZW50cwotICovCi0gaW50Ci1QQlNfU3RvcEV2ZW50cyhpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKGRlYnVnX2xldmVsID4gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiAgUEJTX1N0b3BFdmVudHMgKCVkKTpcbiIsIHRyYW5zX2lkKTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCS8qIG5vdGlmaWNhdGlvbiB0aGF0IHN0YXJ0IGV2ZW50cyBoYXZlIGNvbXBsZXRlZCAqLwotCXNlbmRPS0V2ZW50KGdUcmFuc0lEKTsKLQlnVHJhbnNJRCA9IDA7Ci0Jc2VuZE9LRXZlbnQodHJhbnNfaWQpOwotCXJldHVybiBQUk9YWV9SRVNfT0s7CQotfQotCi0vKioKLSAqIFN1Ym1pdCBhIGpvYiB3aXRoIHRoZSBnaXZlbiBleGVjdXRhYmxlIHBhdGggYW5kIGFyZ3VtZW50cyAocmVtb3RlIGNhbGwgZnJvbSBhIGNsaWVudCBwcm94eSkKLSAqCi0gKiBUT0RPIC0gd2hhdCBhYm91dCBxdWV1ZXMsIHNob3VsZCB0aGVyZSBiZSBhIExTRl9TdWJtaXQ/Ci0gKi8KLWludAotUEJTX1N1Ym1pdEpvYihpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJCQkJaTsKLQlpbnQJCQkJCQlhOwotCWludAkJCQkJCWRlYnVnID0gZmFsc2U7Ci0JaW50CQkJCQkJbnVtX2FyZ3MgPSAwOwotCWludAkJCQkJCW51bV9lbnYgPSAwOwotCWludAkJCQkJCWRlYnVnX2FyZ2MgPSAwOwotCWNoYXIgKgkJCQkJam9ic3ViaWQgPSBOVUxMOwotCWNoYXIgKgkJCQkJcGJzX2pvYmlkID0gTlVMTDsKLQljaGFyICoJCQkJCXF1ZXVlX25hbWUgPSBOVUxMOwotCWNoYXIgKgkJCQkJZnVsbF9wYXRoOwotCWNoYXIgKgkJCQkJcGdtX25hbWUgPSBOVUxMOwotCWNoYXIgKgkJCQkJY3dkID0gTlVMTDsKLQljaGFyICoJCQkJCWV4ZWNfcGF0aCA9IE5VTEw7Ci0JY2hhciAqCQkJCQlkZWJ1Z19leGVjX25hbWUgPSBOVUxMOwotCWNoYXIgKgkJCQkJZGVidWdfZXhlY19wYXRoID0gTlVMTDsKLQljaGFyICoJCQkJCWRlYnVnX2Z1bGxfcGF0aDsKLQljaGFyICoqCQkJCQlkZWJ1Z19hcmdzID0gTlVMTDsKLQljaGFyICoqCQkJCQllbnYgPSBOVUxMOwotCXB0cF9xdWV1ZSAqCQkJCXF1ZXVlOwotCi0JaWYgKGRlYnVnX2xldmVsID4gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiAgUEJTX1N1Ym1pdEpvYiAoJWQpOlxuIiwgdHJhbnNfaWQpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCWlmIChkZWJ1Z19sZXZlbCA+IDApIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiXHQlc1xuIiwgYXJnc1tpXSk7Ci0JCX0KLQkJaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9TVUJfSURfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWpvYnN1YmlkID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoUVVFVUVfSURfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCXF1ZXVlX25hbWUgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShKT0JfRVhFQ19OQU1FX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlwZ21fbmFtZSA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9FWEVDX1BBVEhfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWV4ZWNfcGF0aCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9XT1JLSU5HX0RJUl9BVFRSLCBhcmdzW2ldKSkgewotCQkJY3dkID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoSk9CX1BST0dfQVJHU19BVFRSLCBhcmdzW2ldKSkgewotCQkJbnVtX2FyZ3MrKzsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShKT0JfRU5WX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQludW1fZW52Kys7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoSk9CX0RFQlVHX0FSR1NfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWRlYnVnX2FyZ2MrKzsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShKT0JfREVCVUdfRkxBR19BVFRSLCBhcmdzW2ldKSkgewotCQkJZGVidWcgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2Jvb2woYXJnc1tpXSk7Ci0JCX0KLQl9Ci0KLQlpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCWZmbHVzaChzdGRlcnIpOwotCX0KLQkKLQlpZiAoam9ic3ViaWQgPT0gTlVMTCkgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TVUJNSVQsICJtaXNzaW5nIElEIG9uIGpvYiBzdWJtaXNzaW9uIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCWlmIChwcm94eV9zdGF0ZSAhPSBTVEFURV9SVU5OSU5HKSB7Ci0JCXNlbmRKb2JTdWJFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JzdWJpZCwgIm11c3QgY2FsbCBJTklUIGZpcnN0Iik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCWlmIChxdWV1ZV9uYW1lID09IE5VTEwpIHsKLQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCAibm8gcXVldWUgc3BlY2lmaWVkIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCi0JaWYgKChxdWV1ZSA9IGZpbmRfcXVldWVfYnlfbmFtZShxdWV1ZV9uYW1lKSkgPT0gTlVMTCkgewotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsICJ1bmtub3duIHF1ZXVlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQotCWlmIChuYXJncyA8IDEpIHsKLQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCAiaW5jb3JyZWN0IGFyZyBjb3VudCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQkKLQkvKgotCSAqIERvIHNvbWUgY2hlY2tpbmcgZmlyc3QKLQkgKi8KLQkgCi0JaWYgKHBnbV9uYW1lID09IE5VTEwpIHsKLQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCAiTXVzdCBzcGVjaWZ5IGEgcHJvZ3JhbSBuYW1lIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCS8qCi0JICogR2V0IHN1cHBsaWVkIGVudmlyb25tZW50LiBJdCBpcyB1c2VkIHRvIGxvY2F0ZSBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQkKLQlpZiAobnVtX2VudiA+IDApIHsKLQkJZW52ID0gKGNoYXIgKiopbWFsbG9jKChudW1fZW52ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7Ci0JCWZvciAoaSA9IDAsIGEgPSAwOyBpIDwgbmFyZ3M7IGkrKykgewotCQkJaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9FTlZfQVRUUiwgYXJnc1tpXSkpCi0JCQkJZW52W2ErK10gPSBzdHJkdXAocHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSkpOwotCQl9Ci0JCWVudlthXSA9IE5VTEw7Ci0JfQotCQkKLQkvKgotCSAqIElmIG5vIHBhdGggaXMgc3BlY2lmaWVkLCB0aGVuIHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZS4KLQkgKi8JCQotCWlmIChleGVjX3BhdGggPT0gTlVMTCkgewotCQlmdWxsX3BhdGggPSBwZ21fbmFtZTsKLQl9IGVsc2UgewotCQlhc3ByaW50ZigmZnVsbF9wYXRoLCAiJXMvJXMiLCBleGVjX3BhdGgsIHBnbV9uYW1lKTsKLQl9Ci0JCi0JaWYgKGFjY2VzcyhmdWxsX3BhdGgsIFhfT0spIDwgMCkgewotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCWlmIChkZWJ1ZykgewkJCi0JCWRlYnVnX2FyZ2MrKzsKLQkJZGVidWdfYXJncyA9IChjaGFyICoqKW1hbGxvYygoZGVidWdfYXJnYysxKSAqIHNpemVvZihjaGFyICopKTsKLQkJZm9yIChpID0gMCwgYSA9IDE7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCQlpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoSk9CX0RFQlVHX0FSR1NfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCQlkZWJ1Z19hcmdzW2ErK10gPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoSk9CX0RFQlVHX0VYRUNfTkFNRV9BVFRSLCBhcmdzW2ldKSkgewotCQkJCWRlYnVnX2V4ZWNfbmFtZSA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShKT0JfREVCVUdfRVhFQ19QQVRIX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQkJZGVidWdfZXhlY19wYXRoID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZGVidWdfYXJnc1thXSA9IE5VTEw7Ci0JCQotCQkvKgotCQkgKiBJZiBubyBwYXRoIGlzIHNwZWNpZmllZCwgdGhlbiB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUuCi0JCSAqLwkJCi0JCWlmIChkZWJ1Z19leGVjX3BhdGggPT0gTlVMTCkgewotCQkJZGVidWdfZnVsbF9wYXRoID0gZGVidWdfZXhlY19uYW1lOwotCQl9IGVsc2UgewotCQkJYXNwcmludGYoJmRlYnVnX2Z1bGxfcGF0aCwgIiVzLyVzIiwgZGVidWdfZXhlY19wYXRoLCBkZWJ1Z19leGVjX25hbWUpOwotCQl9Ci0JCQotCQlpZiAoYWNjZXNzKGRlYnVnX2Z1bGxfcGF0aCwgWF9PSykgPCAwKSB7Ci0JCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCQl9Ci0KLQkJZGVidWdfYXJnc1swXSA9IHN0cmR1cChkZWJ1Z19mdWxsX3BhdGgpOwotCX0KLQotCS8qIGFwcF9qb2JpZCA9IHBic19zdWJtaXQoc3RyZWFtLCAuLi4pOyAqLwotCQotCWlmIChwYnNfam9iaWQgPT0gTlVMTCkgewotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsIHBic19nZXRlcnJtc2coc3RyZWFtKSk7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCW5ld19qb2IoMCwgZmFsc2UsIHF1ZXVlLCBqb2JzdWJpZCwgcGJzX2pvYmlkKTsKLQotCS8qCi0JICogU2VuZCBvayBmb3Igam9iIHN1Ym1pc3Npb24uCi0JICovCQotCXNlbmRPS0V2ZW50KHRyYW5zX2lkKTsKLQkKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKiAKLSAqIHRlcm1pbmF0ZSBhIGpvYiwgZ2l2ZW4gYSBqb2JpZCAKLSAqLwotaW50Ci1QQlNfVGVybWluYXRlSm9iKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlpOwotCWludAkJCWpvYmlkID0gLTE7Ci0JcHRwX2pvYiAqCWo7Ci0JCi0JaWYgKHByb3h5X3N0YXRlICE9IFNUQVRFX1JVTk5JTkcpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfSk9CLCAiTXVzdCBjYWxsIElOSVQgZmlyc3QiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKLQkJaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9JRF9BVFRSLCBhcmdzW2ldKSkgewotCQkJam9iaWQgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2ludChhcmdzW2ldKTsKLQkJfQotCX0KLQkKLQlpZiAoam9iaWQgPCAwKSB7Ci0JCXNlbmRKb2JUZXJtaW5hdGVFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JpZCwgIkludmFsaWQgam9iIElEIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCWlmICgoaiA9IGZpbmRfam9iX2J5X2lkKGpvYmlkKSkgIT0gTlVMTCkgewotCQlpZiAoai0+c3RhdGUgPT0gSk9CX1RFUk1JTkFUSU5HKSB7Ci0JCQlzZW5kSm9iVGVybWluYXRlRXJyb3JFdmVudCh0cmFuc19pZCwgam9iaWQsICJKb2IgdGVybWluYXRpb24gYWxyZWFkeSByZXF1ZXN0ZWQiKTsKLQkJCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JCX0KLQkJCi0JCWotPnN0YXRlID0gSk9CX1RFUk1JTkFUSU5HOwotCi0JCS8qIHBic190ZXJtaW5hdGUoai0+cGJzX2pvYmlkKTsgKi8KLQkJCi0JCXNlbmRPS0V2ZW50KHRyYW5zX2lkKTsKLQl9Ci0JCi0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotLyoKLSAqIEVuYWJsZXMgc2VuZGluZyBvZiBldmVudHMuIFRoZSBmaXJzdCB0aGluZyB0aGF0IG11c3QgYmUgc2VudCBpcyBhCi0gKiBkZXNjcmlwdGlvbiBvZiB0aGUgbW9kZWwuIFRoaXMgY29tcHJpc2VzIG5ldyBtb2RlbCBlbGVtZW50IGV2ZW50cwotICogZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbW9kZWwuIE9uY2UgdGhlIG1vZGVsIGRlc2NyaXB0aW9uIGhhcyBiZWVuCi0gKiBzZW50LCBtb2RlbCBjaGFuZ2UgZXZlbnRzIHdpbGwgYmUgc2VudCBhcyBkZXRlY3RlZC4KLSAqIAotICovCi0gaW50Ci1QQlNfU3RhcnRFdmVudHMoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCXB0cF9tYWNoaW5lICoJCQltYWNoOwotCXN0cnVjdCBiYXRjaF9zdGF0dXMgKglzOwotCXN0cnVjdCBiYXRjaF9zdGF0dXMgKglzdGF0dXM7Ci0JCi0JaWYgKGRlYnVnX2xldmVsID4gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiAgUEJTX1N0YXJ0RXZlbnRzICglZCk6XG4iLCB0cmFuc19pZCk7IGZmbHVzaChzdGRlcnIpOwotCX0KLQotCWlmIChwcm94eV9zdGF0ZSAhPSBTVEFURV9SVU5OSU5HKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX1NUQVJUX0VWRU5UUywgIm11c3QgY2FsbCBJTklUIGZpcnN0Iik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCi0JZ1RyYW5zSUQgPSB0cmFuc19pZDsKLQkKLQkvKgotCSAqIFNlbmQgdGhlIFJNIGF0dHJpYnV0ZXMKLQkgKi8KLQlzdGF0dXMgPSBwYnNfc3RhdHNlcnZlcihzdHJlYW0sIE5VTEwsIE5VTEwpOwotCWlmIChzdGF0dXMgPT0gTlVMTCkgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TVEFSVF9FVkVOVFMsIHBic19nZXRlcnJtc2coc3RyZWFtKSk7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCi0Jc2VuZFJNQXR0cmlidXRlc0V2ZW50KHRyYW5zX2lkLCBzdGF0dXMtPmF0dHJpYnMpOwotCi0JLyoKLQkgKiBTZW5kIHRoZSBtYWNoaW5lcwotCSAqLwotCWZvciAoU2V0TGlzdChnTWFjaGluZUxpc3QpOyAobWFjaCA9IChwdHBfbWFjaGluZSAqKUdldExpc3RFbGVtZW50KGdNYWNoaW5lTGlzdCkpICE9IE5VTEw7ICkgewotCQlzZW5kTmV3TWFjaGluZUV2ZW50KHRyYW5zX2lkLCBtYWNoLT5pZCwgbWFjaC0+bmFtZSk7Ci0JfQotCi0JcGJzX3N0YXRmcmVlKHN0YXR1cyk7Ci0KLQkvKgotCSAqIFNlbmQgcXVldWVzIGFuZCBxdWV1ZSBhdHRyaWJ1dGVzCi0JICovCi0Jc3RhdHVzID0gcGJzX3N0YXRxdWUoc3RyZWFtLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoc3RhdHVzID09IE5VTEwpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfU1RBUlRfRVZFTlRTLCBwYnNfZ2V0ZXJybXNnKHN0cmVhbSkpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQotCWZvciAocz1zdGF0dXM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpIHsKLQkJcHRwX3F1ZXVlICogcSA9IGZpbmRfcXVldWVfYnlfbmFtZShzLT5uYW1lKTsKLQkJaWYgKHEgIT0gTlVMTCkgewotCQkJc2VuZE5ld1F1ZXVlRXZlbnQodHJhbnNfaWQsIHEtPmlkLCBxLT5uYW1lLCBzLT5hdHRyaWJzKTsKLQkJfQotCX0KLQotCXBic19zdGF0ZnJlZShzdGF0dXMpOwotCi0JaWYgKGRlYnVnX2xldmVsID4gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiAgZW5kIFBCU19TdGFydEV2ZW50cyAoJWQpOlxuIiwgdHJhbnNfaWQpOyBmZmx1c2goc3RkZXJyKTsKLQl9Ci0KLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi1pbnQKLVBCU19RdWl0KGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQgb2xkX3N0YXRlID0gcHJveHlfc3RhdGU7Ci0JCi0JaWYgKGRlYnVnX2xldmVsID4gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlBCU19RdWl0IGNhbGxlZCFcbiIpOyBmZmx1c2goc3RkZXJyKTsKLQl9Ci0JCi0JcHJveHlfc3RhdGUgPSBTVEFURV9TSFVUVElOR19ET1dOOwotCi0JaWYgKG9sZF9zdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7Ci0JCXNodXRkb3duX3BicygpOwotCX0KLQkKLQlzZW5kU2h1dGRvd25FdmVudCh0cmFuc19pZCk7Ci0JCi0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotaW50Ci1QQlNfRmlsdGVyRXZlbnRzKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQkJaTsKLQlpbnQJCQkJaWQgPSAwOwotCWJvb2wJCQlmaWx0ZXJfY2hpbGRyZW4gPSBmYWxzZTsKLQlwdHBfZmlsdGVyICoJZjsKLQotCWlmIChkZWJ1Z19sZXZlbCA+IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICIgIFBCU19GaWx0ZXJFdmVudHMgKCVkKTpcbiIsIHRyYW5zX2lkKTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCi0JZiA9IG5ld19maWx0ZXIoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCWlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShFTEVNRU5UX0lEX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlpZCA9IGF0b2kocHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSkpOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEZJTFRFUl9DSElMRFJFTl9BVFRSLCBhcmdzW2ldKSkgewotCQkJZmlsdGVyX2NoaWxkcmVuID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9ib29sKGFyZ3NbaV0pOwotCQl9IGVsc2UgewotCQkJYWRkX2ZpbHRlcl9hdHRyaWJ1dGUoZiwgYXJnc1tpXSk7Ci0JCX0KLQl9Ci0KLQlpZiAoaWQgPT0gMCkgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9GSUxURVIsICJubyBlbGVtZW50IElEIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQotCWYtPmNoaWxkcmVuID0gZmlsdGVyX2NoaWxkcmVuOwotCi0JdXBkYXRlX2ZpbHRlcihpZCwgZik7Ci0KLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi1zdGF0aWMgaW50Ci1wb2xsX3BicygpCi17Ci0JaW50CQkJCQkJbmV3X2pvYnMgPSAwOwotCWludAkJCQkJCWNoYW5nZWRfam9icyA9IDA7Ci0JaW50CQkJCQkJcmVtb3ZlZF9qb2JzID0gMDsKLQlIYXNoRW50cnkgKgkJCQloOwotCUhhc2ggKgkJCQkJdG1wSm9iSGFzaDsKLQlwdHBfam9iICoJCQkJajsKLQlzdHJ1Y3QgYmF0Y2hfc3RhdHVzICoJc3RhdHVzOwotCXN0cnVjdCBiYXRjaF9zdGF0dXMgKglzOwotCi0Jc3RhdHVzID0gcGJzX3N0YXRqb2Ioc3RyZWFtLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInBic19zdGF0am9iOiAlc1xuIiwgcGJzX2dldGVycm1zZyhzdHJlYW0pKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGUgdG1wIGpvYiBoYXNoCi0JICogQ3JlYXRlIHRtcCBqb2IgbGlzdAotCSAqIGZvcmVhY2ggKGpvYiBpbiBzdGF0dXMpIHsKLQkgKiAJYWRkIGpvYiBhbmQgYXR0cmlidXRlcyB0byB0bXAgam9iIGhhc2gKLQkgKiAgaWYgKGpvYiBub3QgaW4gam9iIGhhc2gpIHsKLQkgKiAgCWFkZCB0byB0bXAgam9iIGxpc3QKLQkgKiAgfQotCSAqIH0KLQkgKiBmb3JlYWNoIChqb2IgaW4gam9iIGhhc2gpIHsKLQkgKiAJaWYgam9iIGRvZXMgbm90IGV4aXN0IGluIHRtcCBoYXNoLCByZW1vdmUgam9iCi0JICogfQotCSAqIGZvcmVhY2ggKGpvYiBpbiB0bXAgam9iIGxpc3QpIHsKLQkgKiAJYWRkIHRvIGpvYiBoYXNoCi0JICogfQotCSAqLwotCXRtcEpvYkhhc2ggPSBIYXNoQ3JlYXRlKERFRkFVTFRfSEFTSF9TSVpFKTsKLQotCWZvciAocyA9IHN0YXR1czsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkgewotCQlpbnQgaWR4ID0gSGFzaENvbXB1dGUocy0+bmFtZSwgc3RybGVuKHMtPm5hbWUpKTsKLQkJSGFzaEluc2VydCh0bXBKb2JIYXNoLCBpZHgsICh2b2lkICopcyk7Ci0JfQotCi0JZm9yIChIYXNoU2V0KGdKb2JIYXNoKTsgKGggPSBIYXNoR2V0KGdKb2JIYXNoKSkgIT0gTlVMTDsgKSB7Ci0JCWogPSAocHRwX2pvYiAqKWgtPmhfZGF0YTsKLQkJaWYgKEhhc2hGaW5kKHRtcEpvYkhhc2gsIGotPnBic19qb2JpZCkgPT0gTlVMTCkgewotCQkJc2VuZEpvYlN0YXRlQ2hhbmdlRXZlbnQoZ1RyYW5zSUQsIGotPnB0cF9qb2JpZCwgSk9CX1NUQVRFX1RFUk1JTkFURUQpOwotCQkJLy9zZW5kUmVtb3ZlSm9iRXZlbnQoZ1RyYW5zSUQsIGopOwotCQkJcmVtb3ZlZF9qb2JzKys7Ci0JCX0KLQl9Ci0KLQlmb3IgKEhhc2hTZXQodG1wSm9iSGFzaCk7IChoID0gSGFzaEdldCh0bXBKb2JIYXNoKSkgIT0gTlVMTDsgKSB7Ci0JCWogPSAocHRwX2pvYiAqKUhhc2hTZWFyY2goZ0pvYkhhc2gsIGgtPmhfaHZhbCk7Ci0JCXMgPSAoc3RydWN0IGJhdGNoX3N0YXR1cyAqKWgtPmhfZGF0YTsKLQkJaWYgKGogPT0gTlVMTCkgewotCQkJY2hhciAqIHF1ZXVlX25hbWUgPSBOVUxMOwotCQkJcHRwX3F1ZXVlICogcXVldWUgPSBOVUxMOwotCi0JCQlxdWV1ZV9uYW1lID0gZmluZF9wYnNfcXVldWVfbmFtZShzLT5hdHRyaWJzKTsKLQotCQkJaWYgKHF1ZXVlX25hbWUgPT0gTlVMTCB8fCAoKHF1ZXVlID0gZmluZF9xdWV1ZV9ieV9uYW1lKHF1ZXVlX25hbWUpKSA9PSBOVUxMKSkgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogQ2hlY2sgZm9yIHF1ZXVlIGZpbHRlcnMKLQkJCSAqLwotCQkJaWYgKG1hdGNoX2ZpbHRlcl9zdHIocXVldWUtPmlkLCB0cnVlLCBzLT5hdHRyaWJzKSkgewotCQkJCWogPSBuZXdfam9iKDAsIGZhbHNlLCBxdWV1ZSwgTlVMTCwgcy0+bmFtZSk7Ci0KLQkJCQlpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiY3JlYXRpbmcgbmV3IGpvYiBmb3IgJXNcbiIsIHMtPm5hbWUpOyBmZmx1c2goc3RkZXJyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGRlYnVnX2xldmVsID4gMCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiZmlsdGVyZWQgam9iICVzXG4iLCBzLT5uYW1lKTsgZmZsdXNoKHN0ZGVycik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGotPnN0YXRlID09IEpPQl9DUkVBVEVEKSB7Ci0JCQlzZW5kTmV3Sm9iRXZlbnQoZ1RyYW5zSUQsIGopOwotCQkJai0+c3RhdGUgPSBKT0JfTk9STUFMOwotCQkJbmV3X2pvYnMrKzsKLQkJfQotCQljaGFuZ2VkX2pvYnMrKzsKLQl9Ci0KLQlpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicG9sbF9wYnM6IG5ldz0lZCwgY2hhbmdlZD0lZCwgcmVtb3ZlZD0lZFxuIiwgbmV3X2pvYnMsIGNoYW5nZWRfam9icywgcmVtb3ZlZF9qb2JzKTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCi0JSGFzaERlc3Ryb3kodG1wSm9iSGFzaCwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWluaXRpYWxpemUoKQotewotCXN0cnVjdCBwYXNzd2QgKglwdzsKLQotCWdKb2JMaXN0ID0gTmV3TGlzdCgpOwotCWdKb2JIYXNoID0gSGFzaENyZWF0ZShERUZBVUxUX0hBU0hfU0laRSk7Ci0JZ01hY2hpbmVMaXN0ID0gTmV3TGlzdCgpOwotCWdRdWV1ZUxpc3QgPSBOZXdMaXN0KCk7Ci0JZ0ZpbHRlcnMgPSBIYXNoQ3JlYXRlKERFRkFVTFRfRklMVEVSX0hBU0hfU0laRSk7Ci0KLQlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKLQlpZiAocHcgIT0gTlVMTCkgewotCQlnVXNlck5hbWUgPSBzdHJkdXAocHctPnB3X25hbWUpOwotCX0KLX0KLQotc3RhdGljIGludAotc2VydmVyKGNoYXIgKm5hbWUsIGNoYXIgKmhvc3QsIGludCBwb3J0KQotewotCWludAkJCQlyYyA9IDA7Ci0JaW50CQkJCXBvbGxfdGltZW91dCA9IDA7Ci0Jc3RydWN0IHRpbWV2YWwJdGltZW91dCA9IHswLCBQUk9YWV9USU1FT1VUfTsKLQkKLQlpbml0aWFsaXplKCk7Ci0JCi0JaWYgKHByb3h5X3N2cl9pbml0KG5hbWUsICZ0aW1lb3V0LCAmaGVscGVyX2Z1bmNzLCAmY29tbWFuZF90YWIsICZjb25uKSAhPSBQUk9YWV9SRVNfT0spIHsKLQkJaWYgKGRlYnVnX2xldmVsID4gMCkgewotCQkJZnByaW50ZihzdGRlcnIsICJwcm94eSBmYWlsZWQgdG8gaW5pdGlhbGl6ZWRcbiIpOyBmZmx1c2goc3RkZXJyKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JaWYgKHByb3h5X3N2cl9jb25uZWN0KGNvbm4sIGhvc3QsIHBvcnQpID09IFBST1hZX1JFU19PSykgewotCQlpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInByb3h5IGNvbm5lY3RlZFxuIik7IGZmbHVzaChzdGRlcnIpOwotCQl9Ci0JCQotCQl3aGlsZSAocHRwX3NpZ25hbF9leGl0ID09IDAgJiYgcHJveHlfc3RhdGUgIT0gU1RBVEVfU0hVVERPV04pIHsKLQkJCWlmIChwcm94eV9zdGF0ZSA9PSBTVEFURV9TSFVUVElOR19ET1dOKSB7Ci0JCQkJcHJveHlfc3RhdGUgPSBTVEFURV9TSFVURE9XTjsKLQkJCX0KLQkJCWlmIChnVHJhbnNJRCA+IDApIHsKLQkJCQlpZiAoKHBvbGxfdGltZW91dCAtPSBQUk9YWV9USU1FT1VUKSA8PSAwKSB7Ci0JCQkJCWlmIChwb2xsX3BicygpIDwgMCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcG9sbF90aW1lb3V0ID0gUEJTX1BPTExfSU5URVJWQUw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHByb3h5X3N2cl9wcm9ncmVzcyhjb25uKSAhPSBQUk9YWV9SRVNfT0spIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHB0cF9zaWduYWxfZXhpdCAhPSAwKSB7Ci0JCQlpZiAocHRwX3NpZ25hbF9leGl0ICE9IFNJR0NITEQgJiYgcHJveHlfc3RhdGUgIT0gU1RBVEVfU0hVVFRJTkdfRE9XTgotCQkJCQkmJiBwcm94eV9zdGF0ZSAhPSBTVEFURV9TSFVURE9XTikgewotCQkJCXNodXRkb3duX3BicygpOwotCQkJfQotCQkJLyogb3VyIHJldHVybiBjb2RlID0gdGhlIHNpZ25hbCB0aGF0IGZpcmVkICovCi0JCQlyYyA9IHB0cF9zaWduYWxfZXhpdDsKLQkJfQotCX0gZWxzZSBpZiAoZGVidWdfbGV2ZWwgPiAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicHJveHkgY29ubmVjdGlvbiBmYWlsZWRcbiIpOyBmZmx1c2goc3RkZXJyKTsKLQl9Ci0JCi0JcHJveHlfc3ZyX2ZpbmlzaChjb25uKTsKLQkKLQlyZXR1cm4gcmM7Ci19Ci0KLVJFVFNJR1RZUEUKLXB0cF9zaWduYWxfaGFuZGxlcihpbnQgc2lnKQotewotCQlpbnQJcmV0OwotCQlpZiAoc2lnID09IFNJR0NITEQpCi0JCQl3YWl0KCZyZXQpOwotCQlwdHBfc2lnbmFsX2V4aXQgPSBzaWc7Ci0JCWlmKHNpZyA+PSAwICYmIHNpZyA8IE5TSUcpIHsKLQkJCVJFVFNJR1RZUEUgKCpzYXZlZF9zaWduYWwpKGludCkgPSBzYXZlZF9zaWduYWxzW3NpZ107Ci0JCQlpZihzYXZlZF9zaWduYWwgIT0gU0lHX0VSUiAmJiBzYXZlZF9zaWduYWwgIT0gU0lHX0lHTiAmJiBzYXZlZF9zaWduYWwgIT0gU0lHX0RGTCkgewotCQkJCXNhdmVkX3NpZ25hbChzaWcpOwotCQkJfQotCQl9Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCWludAkJCQljaDsKLQlpbnQJCQkJcG9ydCA9IFBST1hZX1RDUF9QT1JUOwotCWNoYXIgKgkJCWhvc3QgPSBERUZBVUxUX0hPU1Q7Ci0JY2hhciAqCQkJcHJveHlfc3RyID0gREVGQVVMVF9QUk9YWTsKLQlpbnQJCQkJcmM7Ci0JCi0Jd2hpbGUgKChjaCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOnA6aDpkOiIsIGxvbmdvcHRzLCBOVUxMKSkgIT0gLTEpCi0Jc3dpdGNoIChjaCkgewotCWNhc2UgJ1AnOgotCQlwcm94eV9zdHIgPSBvcHRhcmc7Ci0JCWJyZWFrOwotCWNhc2UgJ3AnOgotCQlwb3J0ID0gKGludClzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7Ci0JCWJyZWFrOwotCWNhc2UgJ2gnOgotCQlob3N0ID0gb3B0YXJnOwotCQlicmVhazsKLQljYXNlICdkJzoKLQkJZGVidWdfbGV2ZWwgPSAoaW50KXN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICIlcyBbLS1wcm94eT1wcm94eV0gWy0taG9zdD1ob3N0X25hbWVdIFstLXBvcnQ9cG9ydF0gWy0tZGVidWc9bGV2ZWxdXG4iLCBhcmd2WzBdKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCS8qIAotCSAqIHNpZ25hbCBjYW4gaGFwcGVuIGFueSB0aW1lIGFmdGVyIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHNvCi0JICogbWFrZSBzdXJlIHdlIGNhdGNoIGl0Ci0JICovCi0JcHRwX3NpZ25hbF9leGl0ID0gMDsKLQkKLSNpZiAwCi0JLyogc2V0dXAgb3VyIHNpZ25hbCBoYW5kbGVycyAqLwotCXNhdmVkX3NpZ25hbHNbU0lHSU5UXSA9IHNpZ25hbChTSUdJTlQsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0Jc2F2ZWRfc2lnbmFsc1tTSUdIVVBdID0gc2lnbmFsKFNJR0hVUCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQlzYXZlZF9zaWduYWxzW1NJR0lMTF0gPSBzaWduYWwoU0lHSUxMLCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotCXNhdmVkX3NpZ25hbHNbU0lHU0VHVl0gPSBzaWduYWwoU0lHU0VHViwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQlzYXZlZF9zaWduYWxzW1NJR1RFUk1dID0gc2lnbmFsKFNJR1RFUk0sIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0Jc2F2ZWRfc2lnbmFsc1tTSUdRVUlUXSA9IHNpZ25hbChTSUdRVUlULCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotCXNhdmVkX3NpZ25hbHNbU0lHQUJSVF0gPSBzaWduYWwoU0lHQUJSVCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQlzYXZlZF9zaWduYWxzW1NJR0NITERdID0gc2lnbmFsKFNJR0NITEQsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0JCi0JaWYoc2F2ZWRfc2lnbmFsc1tTSUdJTlRdICE9IFNJR19FUlIgJiYgc2F2ZWRfc2lnbmFsc1tTSUdJTlRdICE9IFNJR19JR04gJiYgc2F2ZWRfc2lnbmFsc1tTSUdJTlRdICE9IFNJR19ERkwpIHsKLQkJZnByaW50ZihzdGRlcnIsICIgIC0tLT4gU0lHTkFMIFNJR0lOVCB3YXMgcHJldmlvdXNseSBhbHJlYWR5IGRlZmluZWQuICBTaGFkb3dpbmcuXG4iKTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCWlmKHNhdmVkX3NpZ25hbHNbU0lHSFVQXSAhPSBTSUdfRVJSICYmIHNhdmVkX3NpZ25hbHNbU0lHSFVQXSAhPSBTSUdfSUdOICYmIHNhdmVkX3NpZ25hbHNbU0lHSFVQXSAhPSBTSUdfREZMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAtLS0+IFNJR05BTCBTSUdIVVAgd2FzIHByZXZpb3VzbHkgYWxyZWFkeSBkZWZpbmVkLiAgU2hhZG93aW5nLlxuIik7IGZmbHVzaChzdGRlcnIpOwotCX0KLQlpZihzYXZlZF9zaWduYWxzW1NJR0lMTF0gIT0gU0lHX0VSUiAmJiBzYXZlZF9zaWduYWxzW1NJR0lMTF0gIT0gU0lHX0lHTiAmJiBzYXZlZF9zaWduYWxzW1NJR0lMTF0gIT0gU0lHX0RGTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiAgLS0tPiBTSUdOQUwgU0lHSUxMIHdhcyBwcmV2aW91c2x5IGFscmVhZHkgZGVmaW5lZC4gIFNoYWRvd2luZy5cbiIpOyBmZmx1c2goc3RkZXJyKTsKLQl9Ci0JaWYoc2F2ZWRfc2lnbmFsc1tTSUdTRUdWXSAhPSBTSUdfRVJSICYmIHNhdmVkX3NpZ25hbHNbU0lHU0VHVl0gIT0gU0lHX0lHTiAmJiBzYXZlZF9zaWduYWxzW1NJR1NFR1ZdICE9IFNJR19ERkwpIHsKLQkJZnByaW50ZihzdGRlcnIsICIgIC0tLT4gU0lHTkFMIFNJR1NFR1Ygd2FzIHByZXZpb3VzbHkgYWxyZWFkeSBkZWZpbmVkLiAgU2hhZG93aW5nLlxuIik7IGZmbHVzaChzdGRlcnIpOwotCX0JCi0JaWYoc2F2ZWRfc2lnbmFsc1tTSUdURVJNXSAhPSBTSUdfRVJSICYmIHNhdmVkX3NpZ25hbHNbU0lHVEVSTV0gIT0gU0lHX0lHTiAmJiBzYXZlZF9zaWduYWxzW1NJR1RFUk1dICE9IFNJR19ERkwpIHsKLQkJZnByaW50ZihzdGRlcnIsICIgIC0tLT4gU0lHTkFMIFNJR1RFUk0gd2FzIHByZXZpb3VzbHkgYWxyZWFkeSBkZWZpbmVkLiAgU2hhZG93aW5nLlxuIik7IGZmbHVzaChzdGRlcnIpOwotCX0KLQlpZihzYXZlZF9zaWduYWxzW1NJR1FVSVRdICE9IFNJR19FUlIgJiYgc2F2ZWRfc2lnbmFsc1tTSUdRVUlUXSAhPSBTSUdfSUdOICYmIHNhdmVkX3NpZ25hbHNbU0lHUVVJVF0gIT0gU0lHX0RGTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiAgLS0tPiBTSUdOQUwgU0lHUVVJVCB3YXMgcHJldmlvdXNseSBhbHJlYWR5IGRlZmluZWQuICBTaGFkb3dpbmcuXG4iKTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCWlmKHNhdmVkX3NpZ25hbHNbU0lHQUJSVF0gIT0gU0lHX0VSUiAmJiBzYXZlZF9zaWduYWxzW1NJR0FCUlRdICE9IFNJR19JR04gJiYgc2F2ZWRfc2lnbmFsc1tTSUdBQlJUXSAhPSBTSUdfREZMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAtLS0+IFNJR05BTCBTSUdBQlJUIHdhcyBwcmV2aW91c2x5IGFscmVhZHkgZGVmaW5lZC4gIFNoYWRvd2luZy5cbiIpOyBmZmx1c2goc3RkZXJyKTsKLQl9CQotCWlmKHNhdmVkX3NpZ25hbHNbU0lHQ0hMRF0gIT0gU0lHX0VSUiAmJiBzYXZlZF9zaWduYWxzW1NJR0FCUlRdICE9IFNJR19JR04gJiYgc2F2ZWRfc2lnbmFsc1tTSUdDSExEXSAhPSBTSUdfREZMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAtLS0+IFNJR05BTCBTSUdBQlJUIHdhcyBwcmV2aW91c2x5IGFscmVhZHkgZGVmaW5lZC4gIFNoYWRvd2luZy5cbiIpOyBmZmx1c2goc3RkZXJyKTsKLQl9Ci0jZW5kaWYKLQlyYyA9IHNlcnZlcihwcm94eV9zdHIsIGhvc3QsIHBvcnQpOwotCQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLy5jbGFzc3BhdGggYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI5YWRjLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvcHRwL3JtL3JlbW90ZS9jb3JlLyoiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3JtL3JlbW90ZS91aS8qIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlYTdjYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JhMTAxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBBdWcgMzEgMjE6MTM6NDYgQ0RUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDM1MDBjLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQ0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWk7c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLVZlcnNpb246IDMuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkuQWN0aXZhdG9yDQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsDQotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsDQotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLA0KLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSIzLjAuMCIsDQotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWksDQotIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUsDQotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGU7YnVuZGxlLXZlcnNpb249IjMuMC4wIiwNCi0gb3JnLmVjbGlwc2UucHRwLnVpO2J1bmRsZS12ZXJzaW9uPSIzLjAuMCIsDQotIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2g7YnVuZGxlLXZlcnNpb249IjMuMC4wIiwNCi0gb3JnLmVjbGlwc2UucHRwLnJtLnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMSINCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLnByZWZlcmVuY2VzDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvYWJvdXQuaHRtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDZmM2EuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPg0KLSANCi08cD5BcHJpIDE0LCAyMDA5PC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTVjZjg2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYmluLyxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA2ZWM1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wbHVnaW5OYW1lPVBUUCBQQlMgVUkNCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFhZjg2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4NCi08cGx1Z2luPg0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMucm1QcmVmZXJlbmNlc1BhZ2UiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkucHJlZmVyZW5jZXMuUEJTUHJlZmVyZW5jZVBhZ2UiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wYnMudWkucHJlZmVyZW5jZXMuUEJTUHJlZmVyZW5jZVBhZ2UiDQotICAgICAgICAgICAgbmFtZT0iUEJTIj4NCi0gICAgICA8L3BhZ2U+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnJtTGF1bmNoQ29uZmlndXJhdGlvbnMiPg0KLSAgICAgIDxsYXVuY2hDb25maWd1cmF0aW9uDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkubGF1bmNoLlBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wYnMudWkubGF1bmNoQ29uZmlndXJhdGlvbiIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUucHJvdmlkZXJzIj4NCi0gICAgICA8cHJvdmlkZXINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS5QQlNTZXJ2aWNlUHJvdmlkZXIiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuUEJTU2VydmljZVByb3ZpZGVyIg0KLSAgICAgICAgICAgIG5hbWU9IlBCUyINCi0gICAgICAgICAgICBzZXJ2aWNlSWQ9Im9yZy5lY2xpcHNlLnB0cC5jb3JlLkxhdW5jaFNlcnZpY2UiPg0KLSAgICAgIDwvcHJvdmlkZXI+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkucHJvdmlkZXJDb250cmlidXRvcnMiPg0KLSAgICAgIDxwcm92aWRlckNvbnRyaWJ1dG9yDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkuUEJTUHJvdmlkZXJDb250cmlidXRvciINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLnBicy5QQlNTZXJ2aWNlUHJvdmlkZXIiPg0KLSAgICAgIDwvcHJvdmlkZXJDb250cmlidXRvcj4NCi0gICA8L2V4dGVuc2lvbj4NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9BY3RpdmF0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDM5OWJmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS5QQlNQcmVmZXJlbmNlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsNCi0NCi0JLy8gVGhlIHBsdWctaW4gSUQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkiOyAvLyROT04tTkxTLTEkDQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsNCi0JDQotCS8qKg0KLQkgKiBUaGUgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBY3RpdmF0b3IoKSB7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCVBCU1ByZWZlcmVuY2VNYW5hZ2VyLmluaXRpYWxpemVQcmVmZXJlbmNlcygpOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcGx1Z2luID0gbnVsbDsNCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbg0KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGgNCi0JICoNCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgNCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7DQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL1BCU1Byb3ZpZGVyQ29udHJpYnV0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL1BCU1Byb3ZpZGVyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmOTJiYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9QQlNQcm92aWRlckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkud2l6YXJkcy5QQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuSVJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STVNlcnZpY2VQcm92aWRlckNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgUEJTUHJvdmlkZXJDb250cmlidXRvciBpbXBsZW1lbnRzIElTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciAKLXsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IjY29uZmlndXJlU2VydmljZVByb3ZpZGVyKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciwgQ29tcG9zaXRlIGNvbXApIAotCXsKLQkJLy8gTm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IjZ2V0V2l6YXJkKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIsIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZCBnZXRXaXphcmQoSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciwgSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyZXR1cm4gbmV3IFJNU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZChwcm92aWRlciwgcGFnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciNnZXRXaXphcmRQYWdlcyhvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCwgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgV2l6YXJkUGFnZVtdIGdldFdpemFyZFBhZ2VzKElXaXphcmQgd2l6YXJkLCBJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyKSAKLQl7Ci0JCVdpemFyZFBhZ2Ugd2l6YXJkUGFnZXNbXTsKLQkJCi0JCXdpemFyZFBhZ2VzID0gbmV3IFdpemFyZFBhZ2VbMV07Ci0JCXdpemFyZFBhZ2VzWzBdID0gbmV3IFBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKChJUk1Db25maWd1cmF0aW9uV2l6YXJkKXdpemFyZCk7Ci0JCXJldHVybiB3aXphcmRQYWdlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL1BCU1NlcnZpY2VQcm92aWRlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvdWkvUEJTU2VydmljZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0N2IwN2QuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvdWkvUEJTU2VydmljZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLlBCU1ByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS5ybXN5c3RlbS5JUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUucm1zeXN0ZW0uUEJTUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlclNlcnZpY2VQcm92aWRlcjsKLQotCi0vKioKLSAqIFNlcnZpY2UgcHJvdmlkZXIgZm9yIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudAotICovCi1wdWJsaWMgY2xhc3MgUEJTU2VydmljZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIgaW1wbGVtZW50cyBJUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbnsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BCU0RfUEFUSCA9ICJwYnNkUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BCU0RfQVJHUyA9ICJwYnNkQXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BCU0RfREVGQVVMVFMgPSAicGJzZERlZmF1bHRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQotCXB1YmxpYyBQQlNTZXJ2aWNlUHJvdmlkZXIoKSAKLQl7Ci0JCXN1cGVyKCk7Ci0JCXByZWZlcmVuY2VzID0gUEJTUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJc2V0RGVzY3JpcHRpb24oIlBCUyBSZXNvdXJjZSBNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgUEJTU2VydmljZVByb3ZpZGVyKFBCU1NlcnZpY2VQcm92aWRlciBwcm92aWRlcikKLQl7Ci0JCXN1cGVyKHByb3ZpZGVyKTsKLQkJcHJlZmVyZW5jZXMgPSBQQlNQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCQlzZXRQQlNkQXJncyhwcm92aWRlci5nZXRQQlNkQXJncygpKTsKLQkJc2V0UEJTZFBhdGgocHJvdmlkZXIuZ2V0UEJTZFBhdGgoKSk7Ci0JCXNldFVzZURlZmF1bHRzKHByb3ZpZGVyLmdldFVzZURlZmF1bHRzKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIjY2xvbmUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXJldHVybiBuZXcgUEJTU2VydmljZVByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIjY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCkgewotCQlJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSA9IChJUFVuaXZlcnNlQ29udHJvbCkgUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKTsKLQkJcmV0dXJuIG5ldyBQQlNSZXNvdXJjZU1hbmFnZXIoSW50ZWdlci52YWx1ZU9mKHVuaXZlcnNlLmdldE5leHRSZXNvdXJjZU1hbmFnZXJJZCgpKSwgdW5pdmVyc2UsIHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUucm1zeXN0ZW0uSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jZ2V0UEJTZEFyZ3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UEJTZEFyZ3MoKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoVEFHX1BCU0RfQVJHUywgcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEVNUFRZX1NUUklORykpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUucm1zeXN0ZW0uSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jZ2V0UEJTZFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UEJTZFBhdGgoKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoVEFHX1BCU0RfUEFUSCwgcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEVNUFRZX1NUUklORykpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIjZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKSB7Ci0JCXJldHVybiBnZXRJZCgpOwotCX0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUucm1zeXN0ZW0uSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jZ2V0VXNlRGVmYXVsdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFVzZURlZmF1bHRzKCkgewotCQlyZXR1cm4gZ2V0Qm9vbGVhbihUQUdfUEJTRF9ERUZBVUxUUywgdHJ1ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIjaXNDb25maWd1cmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXREZWZhdWx0TmFtZUFuZERlc2MoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lQW5kRGVzYygpCi0gICAgewotCQlTdHJpbmcgbmFtZSA9ICJQQlMiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb25uID0gZ2V0Q29ubmVjdGlvbk5hbWUoKTsKLQkJaWYgKGNvbm4gIT0gbnVsbCAmJiAhY29ubi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJICAgIG5hbWUgKz0gIkAiICsgY29ubjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldE5hbWUobmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKCJQQlMgUmVzb3VyY2UgTWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS5ybXN5c3RlbS5JUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXRQQlNkQXJncyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBCU2RBcmdzKFN0cmluZyBwYnNkQXJncykgewotCQlwdXRTdHJpbmcoVEFHX1BCU0RfQVJHUywgcGJzZEFyZ3MpOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJtc3lzdGVtLklQQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI3NldFBCU2RQYXRoKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UEJTZFBhdGgoU3RyaW5nIHBic2RQYXRoKSB7Ci0JCXB1dFN0cmluZyhUQUdfUEJTRF9QQVRILCBwYnNkUGF0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJtc3lzdGVtLklQQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI3NldFVzZURlZmF1bHRzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdHMoYm9vbGVhbiB1c2VEZWZhdWx0cykgewotCQlwdXRCb29sZWFuKFRBR19QQlNEX0RFRkFVTFRTLCB1c2VEZWZhdWx0cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvdWkvbGF1bmNoL1BCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL2xhdW5jaC9QQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNDRkYzUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvdWkvbGF1bmNoL1BCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkubGF1bmNoOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRm9jdXNDZWxsT3duZXJEcmF3SGlnaGxpZ2h0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckVkaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckZvY3VzQ2VsbE1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuUk1MYXVuY2hWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUuUEJTSm9iQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5CYXNlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7DQotDQotcHVibGljIGNsYXNzIFBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZXh0ZW5kcyBCYXNlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB7DQotDQotCWNsYXNzIERhdGFTb3VyY2UgZXh0ZW5kcyBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZSB7DQotCQlwcml2YXRlIGJvb2xlYW4gdXNlRGVmQXJnczsNCi0JCXByaXZhdGUgU3RyaW5nIGFyZ3M7DQotCQlwcml2YXRlIGJvb2xlYW4gdXNlRGVmUGFyYW1zOw0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtczsNCi0NCi0JCXByb3RlY3RlZCBEYXRhU291cmNlKEJhc2VSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHBhZ2UpIHsNCi0JCQlzdXBlcihwYWdlKTsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgY29weUZyb21GaWVsZHMoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7DQotCQkJdXNlRGVmQXJncyA9IHVzZUFyZ3NEZWZhdWx0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsNCi0JCQlhcmdzID0gZXh0cmFjdFRleHQoYXJnc1RleHQpOw0KLQ0KLQkJCXVzZURlZlBhcmFtcyA9IHVzZVBhcmFtc0RlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpOw0KLQkJCXBhcmFtcy5jbGVhcigpOw0KLQkJCWZvciAoT2JqZWN0IG9iamVjdCA6IHBhcmFtc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkgew0KLS8vCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJhbWV0ZXIpIHsNCi0vLwkJCQkJUGFyYW1ldGVyIHBhcmFtID0gKFBhcmFtZXRlcikgb2JqZWN0Ow0KLS8vCQkJCQlwYXJhbXMucHV0KHBhcmFtLmdldE5hbWUoKSwgcGFyYW0uZ2V0VmFsdWUoKSk7DQotLy8JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgY29weVRvRmllbGRzKCkgew0KLQkJCWFwcGx5VGV4dChhcmdzVGV4dCwgYXJncyk7DQotCQkJdXNlQXJnc0RlZmF1bHRzQnV0dG9uLnNldFNlbGVjdGlvbih1c2VEZWZBcmdzKTsNCi0JCQl1c2VQYXJhbXNEZWZhdWx0c0J1dHRvbi5zZXRTZWxlY3Rpb24odXNlRGVmUGFyYW1zKTsNCi0NCi0vLwkJCWlmIChpbmZvICE9IG51bGwpIHsNCi0vLwkJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBwYXJhbSA6IHBhcmFtcy5lbnRyeVNldCgpKSB7DQotLy8JCQkJCVBhcmFtZXRlciBwID0gaW5mby5nZXRQYXJhbWV0ZXIocGFyYW0uZ2V0S2V5KCkpOw0KLS8vCQkJCQlpZiAocCAhPSBudWxsKSB7DQotLy8JCQkJCQlwLnNldFZhbHVlKHBhcmFtLmdldFZhbHVlKCkpOw0KLS8vCQkJCQkJcGFyYW1zVmlld2VyLnNldENoZWNrZWQocCwgdHJ1ZSk7DQotLy8JCQkJCQlwYXJhbXNWaWV3ZXIudXBkYXRlKHAsIG51bGwpOw0KLS8vCQkJCQl9DQotLy8JCQkJfQ0KLS8vCQkJfQ0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCkgew0KLS8vCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKA0KLS8vCQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMsDQotLy8JCQkJCXVzZURlZkFyZ3MpOw0KLS8vCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKA0KLS8vCQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywgYXJncyk7DQotLy8JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoDQotLy8JCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMsDQotLy8JCQkJCXVzZURlZlBhcmFtcyk7DQotLy8JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoDQotLy8JCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfUEFSQU1FVEVSUywgcGFyYW1zKTsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgbG9hZERlZmF1bHQoKSB7DQotLy8JCQlhcmdzID0gT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0FSR1VNRU5UUzsNCi0vLwkJCXVzZURlZkFyZ3MgPSBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUzsNCi0vLwkJCXVzZURlZlBhcmFtcyA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUzsNCi0vLwkJCXBhcmFtcyA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QQVJBTUVURVJTOw0KLQ0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7DQotLy8JCQl0cnkgew0KLS8vCQkJCWFyZ3MgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKA0KLS8vCQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9BUkdVTUVOVFMsDQotLy8JCQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfQVJHVU1FTlRTKTsNCi0vLwkJCQl1c2VEZWZBcmdzID0gZ2V0Q29uZmlndXJhdGlvbigpDQotLy8JCQkJLmdldEF0dHJpYnV0ZSgNCi0vLwkJCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUywNCi0vLwkJCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTKTsNCi0vLwkJCQl1c2VEZWZQYXJhbXMgPSBnZXRDb25maWd1cmF0aW9uKCkNCi0vLwkJCQkuZ2V0QXR0cmlidXRlKA0KLS8vCQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUywNCi0vLwkJCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUyk7DQotLy8JCQkJcGFyYW1zID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZSgNCi0vLwkJCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfUEFSQU1FVEVSUywNCi0vLwkJCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QQVJBTUVURVJTKTsNCi0vLwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLS8vCQkJCS8vIFRPRE8gaGFuZGxlIGV4Y2VwdGlvbj8NCi0vLwkJCX0NCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMb2NhbCgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsNCi0vLwkJCWlmICghdXNlRGVmQXJncyAmJiBhcmdzID09IG51bGwpDQotLy8JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oDQotLy8JCQkJCQlNZXNzYWdlcy5BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlBcmd1bWVudHMpOw0KLS8vCQkJaWYgKCF1c2VEZWZQYXJhbXMpIHsNCi0vLwkJCQlmb3IgKE9iamVjdCBvYmplY3QgOiBwYXJhbXNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpIHsNCi0vLwkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcmFtZXRlcikgew0KLS8vCQkJCQkJUGFyYW1ldGVyIHBhcmFtID0gKFBhcmFtZXRlcikgb2JqZWN0Ow0KLS8vCQkJCQkJaWYgKHBhcmFtLmdldFZhbHVlKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLS8vCQkJCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKA0KLS8vCQkJCQkJCQkJTWVzc2FnZXMuQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UGFyYW1ldGVyKTsNCi0vLwkJCQkJfQ0KLS8vCQkJCX0NCi0vLwkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciBpbXBsZW1lbnRzIElDaGVja1N0YXRlTGlzdGVuZXIgew0KLQkJcHVibGljIFdpZGdldExpc3RlbmVyKEJhc2VSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGR5bmFtaWNUYWIpIHsNCi0JCQlzdXBlcihkeW5hbWljVGFiKTsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCi0JCQlpZiAoaXNFbmFibGVkKCkpIHsNCi0JCQkJT2JqZWN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpOw0KLQkJCQlpZiAoc291cmNlID09IHBhcmFtc1ZpZXdlcikgew0KLQkJCQkJZmlyZUNvbnRlbnRzQ2hhbmdlZCgpOw0KLQkJCQkJdXBkYXRlQ29udHJvbHMoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gcGFyYW1zVmlld2VyKSB7DQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOw0KLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZUFyZ3NEZWZhdWx0c0J1dHRvbjsNCi0JcHJvdGVjdGVkIFRleHQgYXJnc1RleHQ7DQotCXByb3RlY3RlZCBCdXR0b24gdXNlUGFyYW1zRGVmYXVsdHNCdXR0b247DQotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIHBhcmFtc1ZpZXdlcjsNCi0JcHJvdGVjdGVkIFRhYmxlIHBhcmFtc1RhYmxlOw0KLQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFuYWdlciBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsNCi0NCi0JcHVibGljIFBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIoSVJlc291cmNlTWFuYWdlciBybSkgew0KLQkJSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gYXR0ckRlZnMgPSBQQlNKb2JBdHRyaWJ1dGVzLmdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyRGVmcy5sZW5ndGg7IGkrKykgew0KLQkJCXRyeSB7DQotCQkJCWF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKGF0dHJEZWZzW2ldLmNyZWF0ZSgpKTsNCi0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCQkvLyBTaG91bGQgbm90IGhhcHBlbiB3aXRoIGRlZmF1bHQgdmFsdWVzDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwNCi0JCQlJUFF1ZXVlIHF1ZXVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQljb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0JCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOw0KLQ0KLQkJZmluYWwgR3JvdXAgam9iQXR0cmlidXRlc0dyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2wsIFNXVC5OT05FKTsNCi0JCWpvYkF0dHJpYnV0ZXNHcm91cC5zZXRUZXh0KCJKb2IgQXR0cmlidXRlcyIpOw0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KLQkJam9iQXR0cmlidXRlc0dyb3VwLnNldExheW91dChsYXlvdXQpOw0KLQkJam9iQXR0cmlidXRlc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwNCi0JCQkJdHJ1ZSwgdHJ1ZSkpOw0KLQ0KLQkJcGFyYW1zVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3Qoam9iQXR0cmlidXRlc0dyb3VwLA0KLQkJCQlTV1QuQ0hFQ0sgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOw0KLQkJcGFyYW1zVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uDQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7DQotCQkJCXJldHVybiBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZXMoKTsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwNCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgew0KLQkJCQkvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbi4NCi0JCQl9DQotCQl9KTsNCi0JCXBhcmFtc1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGoxLCBPYmplY3QgajIpIHsNCi0JCQkJcmV0dXJuICgoSUF0dHJpYnV0ZTw/LD8sPz4pIGoxKS5nZXREZWZpbml0aW9uKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbygNCi0JCQkJCQkoKElBdHRyaWJ1dGU8Pyw/LD8+KSBqMikuZ2V0RGVmaW5pdGlvbigpLmdldE5hbWUoKSk7DQotCQkJfQ0KLQkJfSk7DQotCQlwYXJhbXNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGdldExvY2FsTGlzdGVuZXIoKSk7DQotCQlwYXJhbXNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7DQotDQotCQkvLyBFbmFibGUgY3Vyc29yIGtleXMgaW4gdGFibGUNCi0JCVRhYmxlVmlld2VyRm9jdXNDZWxsTWFuYWdlciBmb2N1c0NlbGxNYW5hZ2VyID0gbmV3IFRhYmxlVmlld2VyRm9jdXNDZWxsTWFuYWdlcigNCi0JCQkJcGFyYW1zVmlld2VyLCBuZXcgRm9jdXNDZWxsT3duZXJEcmF3SGlnaGxpZ2h0ZXIocGFyYW1zVmlld2VyKSk7DQotCQlDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kgYWN0U3VwcG9ydCA9IG5ldyBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3koDQotCQkJCXBhcmFtc1ZpZXdlcikgew0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdG9yQWN0aXZhdGlvbkV2ZW50KA0KLQkJCQkJQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50IGV2ZW50KSB7DQotCQkJCXJldHVybiBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50LlRSQVZFUlNBTA0KLQkJCQl8fCBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50Lk1PVVNFX0RPVUJMRV9DTElDS19TRUxFQ1RJT04NCi0JCQkJfHwgKGV2ZW50LmV2ZW50VHlwZSA9PSBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQuS0VZX1BSRVNTRUQgJiYgZXZlbnQua2V5Q29kZSA9PSBTV1QuQ1IpDQotCQkJCXx8IGV2ZW50LmV2ZW50VHlwZSA9PSBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQuUFJPR1JBTU1BVElDOw0KLQkJCX0NCi0JCX07DQotCQlUYWJsZVZpZXdlckVkaXRvci5jcmVhdGUocGFyYW1zVmlld2VyLCBmb2N1c0NlbGxNYW5hZ2VyLCBhY3RTdXBwb3J0LA0KLQkJCQlDb2x1bW5WaWV3ZXJFZGl0b3IuVEFCQklOR19IT1JJWk9OVEFMDQotCQkJCXwgQ29sdW1uVmlld2VyRWRpdG9yLlRBQkJJTkdfTU9WRV9UT19ST1dfTkVJR0hCT1INCi0JCQkJfCBDb2x1bW5WaWV3ZXJFZGl0b3IuVEFCQklOR19WRVJUSUNBTA0KLQkJCQl8IENvbHVtblZpZXdlckVkaXRvci5LRVlCT0FSRF9BQ1RJVkFUSU9OKTsNCi0NCi0JCXBhcmFtc1RhYmxlID0gcGFyYW1zVmlld2VyLmdldFRhYmxlKCk7DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOw0KLQkJZ2QuaGVpZ2h0SGludCA9IDEwMDsNCi0JCXBhcmFtc1RhYmxlLnNldExheW91dERhdGEoZ2QpOw0KLQkJcGFyYW1zVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOw0KLQkJcGFyYW1zVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCi0JCXBhcmFtc1RhYmxlLnNldEVuYWJsZWQodHJ1ZSk7DQotCQkvLyBEaXNhYmxlIGNlbGwgaXRlbSBzZWxlY3Rpb24NCi0JCXBhcmFtc1RhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQkvKg0KLQkJCSAqIChub24tSmF2YWRvYykNCi0JCQkgKiANCi0JCQkgKiBAc2VlDQotCQkJICogb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpDQotCQkJICovDQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsNCi0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuU0VMRUNURUQ7DQotCQkJfQ0KLQkJfSk7DQotDQotCQlhZGRDb2x1bW5zKCk7DQotDQotCQlwYXJhbXNWaWV3ZXIuc2V0SW5wdXQodGhpcyk7DQotCX0NCi0NCi0JcHVibGljIElBdHRyaWJ1dGU8PywgPywgPz5bXSBnZXRBdHRyaWJ1dGVzKElSZXNvdXJjZU1hbmFnZXIgcm0sDQotCQkJSVBRdWV1ZSBxdWV1ZSwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpDQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsNCi0JCXJldHVybiBjb250cm9sOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KLQkJcmV0dXJuICJKb2IgQXR0cmlidXRlcyI7DQotCX0NCi0NCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBzZXREZWZhdWx0cygNCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIElSZXNvdXJjZU1hbmFnZXIgcm0sDQotCQkJSVBRdWV1ZSBxdWV1ZSkgew0KLS8vCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZSgNCi0vLwkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMsDQotLy8JCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpOw0KLS8vCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywNCi0vLwkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfQVJHVU1FTlRTKTsNCi0vLwkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoDQotLy8JCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUywNCi0vLwkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMpOw0KLS8vCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1BBUkFNRVRFUlMsDQotLy8JCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BBUkFNRVRFUlMpOw0KLQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgbnVsbCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGQgY29sdW1ucyB0byB0aGUgdGFibGUgdmlld2VyDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1ucygpIHsNCi0JCS8qDQotCQkgKiBOYW1lIGNvbHVtbg0KLQkJICovDQotCQlmaW5hbCBUYWJsZVZpZXdlckNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHBhcmFtc1ZpZXdlciwNCi0JCQkJU1dULk5PTkUpOw0KLQkJY29sdW1uMS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgew0KLQkJCS8qDQotCQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJCSAqIA0KLQkJCSAqIEBzZWUNCi0JCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcNCi0JCQkgKiAuT2JqZWN0KQ0KLQkJCSAqLw0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBdHRyaWJ1dGU8Pyw/LD8+KSB7DQotCQkJCQlTdHJpbmcgbmFtZSA9ICgoSUF0dHJpYnV0ZTw/LD8sPz4pIGVsZW1lbnQpLmdldERlZmluaXRpb24oKS5nZXROYW1lKCk7DQotCQkJCQlyZXR1cm4gbmFtZTsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotDQotCQl9KTsNCi0JCWNvbHVtbjEuZ2V0Q29sdW1uKCkuc2V0UmVzaXphYmxlKHRydWUpOw0KLQkJY29sdW1uMS5nZXRDb2x1bW4oKS5zZXRUZXh0KCJBdHRyaWJ1dGUiKTsNCi0NCi0JCS8qDQotCQkgKiBWYWx1ZSBjb2x1bW4NCi0JCSAqLw0KLQkJZmluYWwgVGFibGVWaWV3ZXJDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbihwYXJhbXNWaWV3ZXIsDQotCQkJCVNXVC5OT05FKTsNCi0JCWNvbHVtbjIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsNCi0JCQkvKg0KLQkJCSAqIChub24tSmF2YWRvYykNCi0JCQkgKiANCi0JCQkgKiBAc2VlDQotCQkJICogb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nDQotCQkJICogLk9iamVjdCkNCi0JCQkgKi8NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQXR0cmlidXRlPD8sPyw/Pikgew0KLQkJCQkJcmV0dXJuICgoSUF0dHJpYnV0ZTw/LD8sPz4pIGVsZW1lbnQpLmdldFZhbHVlQXNTdHJpbmcoKTsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotDQotCQl9KTsNCi0JCWNvbHVtbjIuc2V0RWRpdGluZ1N1cHBvcnQobmV3IEVkaXRpbmdTdXBwb3J0KHBhcmFtc1ZpZXdlcikgew0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpIHsNCi0JCQkJcmV0dXJuIHBhcmFtc1ZpZXdlci5nZXRDaGVja2VkKGVsZW1lbnQpOw0KLQkJCX0NCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7DQotCQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IocGFyYW1zVGFibGUpOw0KLQkJCX0NCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7DQotCQkJCXJldHVybiAoKElBdHRyaWJ1dGU8Pyw/LD8+KSBlbGVtZW50KS5nZXRWYWx1ZUFzU3RyaW5nKCk7DQotCQkJfQ0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCSgoSUF0dHJpYnV0ZTw/LD8sPz4pIGVsZW1lbnQpLnNldFZhbHVlQXNTdHJpbmcoKFN0cmluZykgdmFsdWUpOw0KLQkJCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCWdldFZpZXdlcigpLnVwZGF0ZShlbGVtZW50LCBudWxsKTsNCi0JCQkJZmlyZUNvbnRlbnRzQ2hhbmdlZCgpOw0KLQkJCQl1cGRhdGVDb250cm9scygpOw0KLQkJCX0NCi0JCX0pOw0KLQkJY29sdW1uMi5nZXRDb2x1bW4oKS5zZXRSZXNpemFibGUodHJ1ZSk7DQotCQljb2x1bW4yLmdldENvbHVtbigpLnNldFRleHQoIlZhbHVlIik7DQotDQotCQlwYXJhbXNUYWJsZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyYW1zVGFibGUuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJCQkvLyBQb2ludCBzaXplID0gcGFyYW1zVGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsDQotCQkJCS8vIFNXVC5ERUZBVUxUKTsNCi0JCQkJU2Nyb2xsQmFyIHZCYXIgPSBwYXJhbXNUYWJsZS5nZXRWZXJ0aWNhbEJhcigpOw0KLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoDQotCQkJCQktIHBhcmFtc1RhYmxlLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApLndpZHRoDQotCQkJCQktIHZCYXIuZ2V0U2l6ZSgpLng7DQotCQkJCXBhcmFtc1RhYmxlLmdldENvbHVtbigxKS5zZXRXaWR0aCh3aWR0aCAvIDMpOw0KLQkJCQlwYXJhbXNUYWJsZS5nZXRDb2x1bW4oMCkuc2V0V2lkdGgoDQotCQkJCQkJd2lkdGggLSBwYXJhbXNUYWJsZS5nZXRDb2x1bW4oMSkuZ2V0V2lkdGgoKSk7DQotCQkJfQ0KLQkJfSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBEYXRhU291cmNlIGdldExvY2FsRGF0YVNvdXJjZSgpIHsNCi0JCXJldHVybiAoRGF0YVNvdXJjZSkgc3VwZXIuZ2V0RGF0YVNvdXJjZSgpOw0KLQl9DQotDQotCXByaXZhdGUgV2lkZ2V0TGlzdGVuZXIgZ2V0TG9jYWxMaXN0ZW5lcigpIHsNCi0JCXJldHVybiAoV2lkZ2V0TGlzdGVuZXIpIHN1cGVyLmdldExpc3RlbmVyKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZSBjcmVhdGVEYXRhU291cmNlKCkgew0KLQkJcmV0dXJuIG5ldyBEYXRhU291cmNlKHRoaXMpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCkgew0KLQkJcmV0dXJuIG5ldyBXaWRnZXRMaXN0ZW5lcih0aGlzKTsNCi0JfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9sYXVuY2gvUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvdWkvbGF1bmNoL1BCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwNDg0Yy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9sYXVuY2gvUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLmxhdW5jaDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnBicy5jb3JlLnJtc3lzdGVtLlBCU1Jlc291cmNlTWFuYWdlcjsNCi0NCi1wdWJsaWMgY2xhc3MgUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSBleHRlbmRzDQotCQlBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3Rvcnkgew0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGRvQ3JlYXRlKElSZXNvdXJjZU1hbmFnZXIgcm0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBuZXcgUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihybSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVJlc291cmNlTWFuYWdlcj4gZ2V0UmVzb3VyY2VNYW5hZ2VyQ2xhc3MoKSB7DQotCQlyZXR1cm4gUEJTUmVzb3VyY2VNYW5hZ2VyLmNsYXNzOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmE4MmQyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkubWVzc2FnZXM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotDQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkubWVzc2FnZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX25hbWU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbjsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8wOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzE7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8zOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzQ7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl82Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzc7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfODsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl85Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzEwOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9uYW1lOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV90aXRsZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzY3JpcHRpb247DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2RlZmF1bHRCdXR0b247DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Jyb3dzZUJ1dHRvbjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfcGF0aDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfYXJndW1lbnRzOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9zZWxlY3Q7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3I7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3JfbXNnOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9udW1Qcm9jc0ludmFsaWQ7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpbWVMaW1pdEludmFsaWQ7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1ByZWZlcmVuY2VzUGFnZV9ncm91cF9wYnNkOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNQcmVmZXJlbmNlc1BhZ2VfcGJzZEZpbGVfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTUHJlZmVyZW5jZXNQYWdlX1NlbGVjdF9QQlNkX0ZJTEU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1ByZWZlcmVuY2VzUGFnZV9JbmNvcnJlY3RfUEJTZF9maWxlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNQcmVmZXJlbmNlc1BhZ2VfcGJzZEFyZ3NfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTUHJlZmVyZW5jZXNQYWdlX3Bic2RGdWxsX3RleHQ7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBCU1ByZWZlcmVuY2VzUGFnZV9ncm91cF9wcm94eTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEJTUHJlZmVyZW5jZXNQYWdlX3Bic1NlcnZlcl90ZXh0Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNQcmVmZXJlbmNlc1BhZ2VfU2VsZWN0X1BCU19QUk9YWV9GSUxFOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNQcmVmZXJlbmNlc1BhZ2VfSW5jb3JyZWN0X3NlcnZlcl9maWxlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNQcmVmZXJlbmNlc1BhZ2VfbWFudWFsOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQlNQcmVmZXJlbmNlc1BhZ2VfYnJvd3NlQnV0dG9uOw0KLQkNCi0Jc3RhdGljIHsNCi0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlDQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7DQotCX0NCi0NCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsNCi0JCS8vIFByZXZlbnQgaW5zdGFuY2VzLg0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzc0NzMyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1QQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9uYW1lPVBCUyBQcm94eSBDb25maWd1cmF0aW9uDQotUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGU9UEJTIFByb3h5IENvbmZpZ3VyYXRpb24NCi1QQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25uZWN0IHRvIGFuIFBCUyBwcm94eSBzZXJ2ZXINCi1QQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzA9TnVtYmVyIG9mIFByb2Nlc3Nlcygtbik6IA0KLVBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMT1UaW1lIExpbWl0KC10KToNCi1QQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzEwPVBsZWFzZSBpbnB1dCB0aGUgbGltaXQoPj0xKSBvZiBydW5uaW5nIHRpbWUobWludXRlcylcIQ0KLVBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMj1QYXJ0YXRpb24gUmVxdWVzdGVkKC1wKToNCi1QQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzM9Sm9iIFR5cGUoLS1qb2J0eXBlKToNCi1QQlNSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzQ9dHJ1ZQ0KLVBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNT1Kb2IgSW8gTGFiZWwoLWwpOg0KLVBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNj10cnVlDQotUEJTUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl83PUpvYiBWZXJib3NlIE1vZGUoLXYpOg0KLVBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfOD1Kb2IgTm9kZWxpc3QoLXcpOg0KLVBCU1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfOT1QbGVhc2UgaW5wdXQgdGhlIGludGVnZXIgbnVtYmVyKD49MSkgb2YgcHJvY2Vzc2VzXCENCi0NCi1QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9uYW1lPVBCU0QgQ29uZmlndXJhdGlvbg0KLVBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlPVBCU0QgQ29uZmlndXJhdGlvbg0KLVBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Rlc2NyaXB0aW9uPUVudGVyIGluZm9ybWF0aW9uIHRvIGNvbmZpZ3VyZSBQQlNEDQotUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVmYXVsdEJ1dHRvbj1Vc2UgZGVmYXVsdCBzZXR0aW5ncw0KLVBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Jyb3dzZUJ1dHRvbj1Ccm93c2UNCi1QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9wYXRoPVBhdGggdG8gUEJTRDoNCi1QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9hcmd1bWVudHM9RXh0cmEgUEJTRCBhcmd1bWVudHM6DQotUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfaW52YWxpZD1JbnZhbGlkIFBCU0QgcGF0aA0KLVBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3NlbGVjdD1TZWxlY3QgUEJTRCBleGVjdXRhYmxlDQotUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcj1Db25uZWN0aW9uIEVycm9yDQotUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcl9tc2c9Q291bGQgbm90IG9wZW4gY29ubmVjdGlvbg0KLVBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX251bVByb2NzSW52YWxpZD0NCi1QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV90aW1lTGltaXRJbnZhbGlkPQ0KLVBCU1ByZWZlcmVuY2VzUGFnZV9ncm91cF9wYnNkPU9wZW4gUnVudGltZSBFbnZpcm9ubWVudCBEYWVtb24NCi1QQlNQcmVmZXJlbmNlc1BhZ2VfcGJzZEZpbGVfdGV4dD1QQlNkIGZpbGU6DQotUEJTUHJlZmVyZW5jZXNQYWdlX1NlbGVjdF9QQlNkX0ZJTEU9U2VsZWN0IFBCU2QgZmlsZQ0KLVBCU1ByZWZlcmVuY2VzUGFnZV9JbmNvcnJlY3RfUEJTZF9maWxlPUludmFsaWQgUEJTIGRhZW1vbiBmaWxlDQotUEJTUHJlZmVyZW5jZXNQYWdlX3Bic2RBcmdzX3RleHQ9UEJTZCBhcmd1bWVudHM6DQotUEJTUHJlZmVyZW5jZXNQYWdlX3Bic2RGdWxsX3RleHQ9UEJTZCBydW4gY29tbWFuZDoNCi1QQlNQcmVmZXJlbmNlc1BhZ2VfZ3JvdXBfcHJveHk9UEJTIFBUUCBQcm94eSBTZXJ2ZXINCi1QQlNQcmVmZXJlbmNlc1BhZ2VfcGJzU2VydmVyX3RleHQ9UEJTfFBUUCBwcm94eSBzZXJ2ZXIgZmlsZToNCi1QQlNQcmVmZXJlbmNlc1BhZ2VfU2VsZWN0X1BCU19QUk9YWV9GSUxFPVNlbGVjdCBQQlN8UFRQIFByb3h5IHNlcnZlciBmaWxlDQotUEJTUHJlZmVyZW5jZXNQYWdlX0luY29ycmVjdF9zZXJ2ZXJfZmlsZT1JbnZhbGlkIFBCU3xQVFAgcHJveHkgc2VydmVyIGZpbGUNCi1QQlNQcmVmZXJlbmNlc1BhZ2VfbWFudWFsPUxhdW5jaCBQQlMgc2VydmVyIG1hbnVhbGx5DQotUEJTUHJlZmVyZW5jZXNQYWdlX2Jyb3dzZUJ1dHRvbj1Ccm93c2UNCi0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9wcmVmZXJlbmNlcy9QQlNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvdWkvcHJlZmVyZW5jZXMvUEJTUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiYzdhZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS9wcmVmZXJlbmNlcy9QQlNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLnByZWZlcmVuY2VzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMuY29yZS5QQlNQcmVmZXJlbmNlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQQlNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UmVtb3RlUHJlZmVyZW5jZVBhZ2Ugew0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlI2dldFByZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsNCi0JCXJldHVybiBQQlNQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOw0KLQl9DQotCQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlI3NhdmVQcmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7DQotCQlQQlNQcmVmZXJlbmNlTWFuYWdlci5zYXZlUHJlZmVyZW5jZXMoKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS93aXphcmRzL1BCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS93aXphcmRzL1BCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTJmZjUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9wYnMvdWkvd2l6YXJkcy9QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS53aXphcmRzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuUFRQUmVtb3RlQ29yZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSUZpbGVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSVNlcnZpY2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLlBUUFJlbW90ZVVJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLmNvcmUucm1zeXN0ZW0uSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkuQWN0aXZhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5JUk1Db25maWd1cmF0aW9uV2l6YXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LlNXVFV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7DQotDQotcHVibGljIGNsYXNzIFBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZSB7DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIA0KLQl7DQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgew0KLQkJCU9iamVjdCBzb3VyY2UgPSBldnQuZ2V0U291cmNlKCk7DQotCQkJaWYoIWxvYWRpbmcgJiYgKHNvdXJjZSA9PSBwYXRoVGV4dCB8fCBzb3VyY2UgPT0gYXJnc1RleHQpKSB7DQotCQkJCXVwZGF0ZVBhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQ0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgew0KLQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhGaWVsZEVkaXRvci5JU19WQUxJRCkpIHsNCi0JCQkJdXBkYXRlUGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JDQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7DQotCQkJaWYgKHNvdXJjZSA9PSBicm93c2VCdXR0b24pIHsNCi0JCQkJaGFuZGxlUGF0aEJyb3dzZUJ1dHRvblNlbGVjdGVkKCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJdXBkYXRlU2V0dGluZ3MoKTsNCi0JCQkJdXBkYXRlUGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIElQQlNSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZzsNCi0JcHJpdmF0ZSBTdHJpbmcgcGJzZFBhdGggPSBFTVBUWV9TVFJJTkc7DQotCXByaXZhdGUgU3RyaW5nIHBic2RBcmdzID0gRU1QVFlfU1RSSU5HOw0KLQlwcml2YXRlIElSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcyA9IG51bGw7DQotCXByaXZhdGUgSVJlbW90ZUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7DQotCXByaXZhdGUgYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQ7DQotCXByaXZhdGUgYm9vbGVhbiB1c2VEZWZhdWx0czsNCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0ID0gbnVsbDsNCi0NCi0JcHJpdmF0ZSBUZXh0IGFyZ3NUZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsNCi0JcHJpdmF0ZSBCdXR0b24gZGVmYXVsdEJ1dHRvbiA9IG51bGw7DQotCXByaXZhdGUgV2lkZ2V0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2lkZ2V0TGlzdGVuZXIoKTsNCi0JDQotCXB1YmxpYyBQQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZShJUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgew0KLQkJc3VwZXIod2l6YXJkLCBNZXNzYWdlcy5QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9uYW1lKTsNCi0JCXNldFRpdGxlKE1lc3NhZ2VzLlBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlKTsNCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Rlc2NyaXB0aW9uKTsNCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsNCi0JCWlzVmFsaWQgPSB0cnVlOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0JCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQodG9wTGF5b3V0KTsNCi0JCWNyZWF0ZUNvbnRlbnRzKGNvbXBvc2l0ZSk7DQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgaW4gdGhlIFJNIGNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyDQotCSAqIGFueXRoaW5nIGlzIGNoYW5nZWQuDQotCSAqIA0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSANCi0Jew0KLQkJc3RvcmUoKTsNCi0JCWNvbmZpZy5zZXRVc2VEZWZhdWx0cyh1c2VEZWZhdWx0cyk7DQotCQlpZiAoIXVzZURlZmF1bHRzKSB7DQotCQkJY29uZmlnLnNldFBCU2RQYXRoKHBic2RQYXRoKTsNCi0JCQljb25maWcuc2V0UEJTZEFyZ3MocGJzZEFyZ3MpOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQotCQlpZiAodmlzaWJsZSkgew0KLQkJCWluaXRDb250ZW50cygpOw0KLQkJfQ0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHdpemFyZCBwYWdlLg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmVudA0KLQkgKiBAcGFyYW0gY29sU3Bhbg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCS8qDQotCQkgKiBDb21wb3NpdGUgZm9yIHJlbW90ZSBwcm92aWRlciBhbmQgcHJveHkgbG9jYXRpb24gY29tYm8ncw0KLQkJICovDQotCQlDb21wb3NpdGUgY29udGVudHMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOw0KLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsNCi0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMzsNCi0JCWNvbnRlbnRzLnNldExheW91dERhdGEoZ2QpOw0KLQ0KLQkJLyoNCi0JCSAqIERlZmF1bHQNCi0JCSAqLw0KLQkJZGVmYXVsdEJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGNvbnRlbnRzLCBNZXNzYWdlcy5QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZWZhdWx0QnV0dG9uKTsNCi0JCWRlZmF1bHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMzsNCi0JCWRlZmF1bHRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7DQotDQotCQkvKg0KLQkJICogUEJTRCBwYXRoDQotCQkgKi8NCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7DQotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3BhdGgpOw0KLQ0KLQkJcGF0aFRleHQgPSBuZXcgVGV4dChjb250ZW50cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMTsNCi0JCWdkLndpZHRoSGludCA9IDYwOw0KLQkJcGF0aFRleHQuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7DQotCQkNCi0JCWJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlUHVzaEJ1dHRvbihjb250ZW50cywgTWVzc2FnZXMuUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uLCBudWxsKTsNCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7DQotCQkNCi0JCS8qDQotCQkgKiBQQlNEIGFyZ3MNCi0JCSAqLw0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5OT05FKTsNCi0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfYXJndW1lbnRzKTsNCi0JCQ0KLQkJYXJnc1RleHQgPSBuZXcgVGV4dChjb250ZW50cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMjsNCi0JCWFyZ3NUZXh0LnNldExheW91dERhdGEoZ2QpOw0KLQkJYXJnc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgY29udHJvbHMuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgaW5pdENvbnRlbnRzKCkgew0KLQkJbG9hZGluZyA9IHRydWU7DQotCQljb25maWcgPSAoSVBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pZ2V0Q29uZmlndXJhdGlvbldpemFyZCgpLmdldENvbmZpZ3VyYXRpb24oKTsNCi0JCWxvYWRTYXZlZCgpOw0KLQkJdXBkYXRlU2V0dGluZ3MoKTsNCi0JCWRlZmF1bHRTZXR0aW5nKCk7DQotCQlsb2FkaW5nID0gZmFsc2U7DQotCQl1cGRhdGVQYWdlKCk7CQ0KLQl9DQotCQ0KLQkvKioNCi0JICogTG9hZCB0aGUgaW5pdGlhbCB3aXphcmQgc3RhdGUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4NCi0JICovDQotCXByaXZhdGUgdm9pZCBsb2FkU2F2ZWQoKQ0KLQl7DQotCQl1c2VEZWZhdWx0cyA9IGNvbmZpZy5nZXRVc2VEZWZhdWx0cygpOw0KLQkJcGJzZFBhdGggPSBjb25maWcuZ2V0UEJTZFBhdGgoKTsNCi0JCXBic2RBcmdzID0gY29uZmlnLmdldFBCU2RBcmdzKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcGFyYW0gYg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHNldFZhbGlkKGJvb2xlYW4gYikgew0KLQkJaXNWYWxpZCA9IGI7DQotCQlzZXRQYWdlQ29tcGxldGUoaXNWYWxpZCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBzdG9yZSgpIA0KLQl7DQotCQlpZiAoIWxvYWRpbmcpIHsNCi0JCQlpZiAoZGVmYXVsdEJ1dHRvbiAhPSBudWxsKSB7DQotCQkJCXVzZURlZmF1bHRzID0gZGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsNCi0JCQl9DQotCQkJaWYgKHBhdGhUZXh0ICE9IG51bGwpIHsNCi0JCQkJcGJzZFBhdGggPSBwYXRoVGV4dC5nZXRUZXh0KCk7DQotCQkJfQ0KLQkJCWlmIChhcmdzVGV4dCAhPSBudWxsKSB7DQotCQkJCXBic2RBcmdzID0gYXJnc1RleHQuZ2V0VGV4dCgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFVwZGF0ZSB3aXphcmQgVUkgc2VsZWN0aW9ucyBmcm9tIHNldHRpbmdzLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55DQotCSAqIHNldHRpbmdzIGFyZSBjaGFuZ2VkLg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNldHRpbmdzKCkgew0KLQkJc3RvcmUoKTsNCi0JCXBhdGhUZXh0LnNldEVuYWJsZWQoIXVzZURlZmF1bHRzKTsNCi0JCWFyZ3NUZXh0LnNldEVuYWJsZWQoIXVzZURlZmF1bHRzKTsNCi0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0cyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBidXR0b24gd2lkZ2V0Lg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmVudA0KLQkgKiBAcGFyYW0gbGFiZWwNCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHJldHVybiB0aGUgYnV0dG9uIHdpZGdldA0KLQkgKi8NCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgdHlwZSkgew0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCB0eXBlKTsNCi0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsNCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOw0KLQkJcmV0dXJuIGJ1dHRvbjsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBjaGVjayBidXR0b24gd2lkZ2V0Lg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmVudA0KLQkgKiBAcGFyYW0gbGFiZWwNCi0JICogQHJldHVybiB0aGUgY2hlY2sgYnV0dG9uIHdpZGdldA0KLQkgKi8NCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVDaGVja0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsNCi0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCBsYWJlbCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgZ3JpZCBsYXlvdXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gY29sdW1ucw0KLQkgKiBAcGFyYW0gaXNFcXVhbA0KLQkgKiBAcGFyYW0gbWgNCi0JICogQHBhcmFtIG13DQotCSAqIEByZXR1cm4gdGhlIG5ldyBncmlkIGxheW91dA0KLQkgKi8NCi0JcHJvdGVjdGVkIEdyaWRMYXlvdXQgY3JlYXRlR3JpZExheW91dChpbnQgY29sdW1ucywgYm9vbGVhbiBpc0VxdWFsLCBpbnQgbWgsIGludCBtdykgIHsNCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSBjb2x1bW5zOw0KLQkJZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBpc0VxdWFsOw0KLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBtaDsNCi0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSBtdzsNCi0JCXJldHVybiBncmlkTGF5b3V0Ow0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBuZXcgcmFkaW8gYnV0dG9uIGluc3RhbmNlIGFuZCBzZXRzIHRoZSBkZWZhdWx0DQotCSAqIGxheW91dCBkYXRhLg0KLQkgKg0KLQkgKiBAcGFyYW0gZ3JvdXAgIHRoZSBjb21wb3NpdGUgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSByYWRpbyBidXR0b24NCi0JICogQHBhcmFtIGxhYmVsICB0aGUgc3RyaW5nIHRvIHNldCBpbnRvIHRoZSByYWRpbyBidXR0b24NCi0JICogQHBhcmFtIHZhbHVlICB0aGUgc3RyaW5nIHRvIGlkZW50aWZ5IHJhZGlvIGJ1dHRvbg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgcmFkaW8gYnV0dG9uDQotCSAqLyANCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyB2YWx1ZSwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCUJ1dHRvbiBidXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBsYWJlbCwgU1dULlJBRElPIHwgU1dULkxFRlQpOw0KLQkJYnV0dG9uLnNldERhdGEoKG51bGwgPT0gdmFsdWUpID8gbGFiZWwgOiB2YWx1ZSk7DQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7DQotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsNCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOw0KLQkJaWYobnVsbCAhPSBsaXN0ZW5lcikgew0KLQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7DQotCQl9DQotCQlyZXR1cm4gYnV0dG9uOw0KLQl9DQotCQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBkZWZhdWx0U2V0dGluZygpIA0KLQl7DQotCQlkZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbih1c2VEZWZhdWx0cyk7DQotCQlwYXRoVGV4dC5zZXRUZXh0KHBic2RQYXRoKTsNCi0JCWFyZ3NUZXh0LnNldFRleHQocGJzZEFyZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDbGVhbiB1cCB0aGUgY29udGVudCBvZiBhIHRleHQgZmllbGQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdGV4dA0KLQkgKiBAcmV0dXJuIGNsZWFuZWQgdXAgdGV4dC4NCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRDb250ZW50KFN0cmluZyB0ZXh0KSANCi0Jew0KLQkJaWYgKHRleHQudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgdGV4dC5lcXVhbHMoRU1QVFlfU1RSSU5HKSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JDQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2hvdyBhIGRpYWxvZyB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IGEgZmlsZS4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhdGhCcm93c2VCdXR0b25TZWxlY3RlZCgpIA0KLQl7DQotCQkvKg0KLQkJICogTmVlZCB0byBkbyB0aGlzIGhlcmUgYmVjYXVzZSB0aGUgY29ubmVjdGlvbiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgDQotCQkgKiBieSB0aGUgcHJldmlvdXMgd2l6YXJkIHBhZ2UNCi0JCSAqLw0KLQkJU3RyaW5nIHJtSUQgPSBjb25maWcuZ2V0UmVtb3RlU2VydmljZXNJZCgpOw0KLQkJaWYgKHJtSUQgIT0gbnVsbCkgew0KLQkJCXJlbW90ZVNlcnZpY2VzID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMocm1JRCk7DQotCQkJU3RyaW5nIGNvbm4gPSBjb25maWcuZ2V0Q29ubmVjdGlvbk5hbWUoKTsNCi0JCQlpZiAocmVtb3RlU2VydmljZXMgIT0gbnVsbCAmJiBjb25uICE9IG51bGwpIHsNCi0JCQkJY29ubmVjdGlvbiA9IHJlbW90ZVNlcnZpY2VzLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0Q29ubmVjdGlvbihjb25uKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsNCi0JCQlpZiAoIWNvbm5lY3Rpb24uaXNPcGVuKCkpIHsNCi0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsNCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLA0KLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJY29ubmVjdGlvbi5vcGVuKG1vbml0b3IpOw0KLQkJCQkJCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgew0KLQkJCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvciwNCi0JCQkJCQkJCQlNZXNzYWdlcy5QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yX21zZywNCi0JCQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpKSk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCX07DQotCQkJCXRyeSB7DQotCQkJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBvcCk7DQotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLlBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3IsDQotCQkJCQkJCU1lc3NhZ2VzLlBCU0NvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3JfbXNnLA0KLQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpKSk7DQotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yLA0KLQkJCQkJCQlNZXNzYWdlcy5QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yX21zZywNCi0JCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCUlSZW1vdGVVSVNlcnZpY2VzIHJlbW90ZVVJU2VydmljZXMgPSBQVFBSZW1vdGVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlVUlTZXJ2aWNlcyhyZW1vdGVTZXJ2aWNlcyk7DQotCQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZmlsZU1nciA9IHJlbW90ZVVJU2VydmljZXMuZ2V0VUlGaWxlTWFuYWdlcigpOw0KLQkJCQ0KLQkJCVN0cmluZyBpbml0aWFsUGF0aCA9ICIvLyI7IC8vIFN0YXJ0IGF0IHJvb3Qgc2luY2UgUEJTRCBpcyBwcm9iYWJseSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBzb21ld2hlcmUgLy8kTk9OLU5MUy0xJA0KLQkJCUlQYXRoIHNlbGVjdGVkUGF0aCA9IGZpbGVNZ3IuYnJvd3NlRmlsZShnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuUEJTQ29uZmlndXJhdGlvbldpemFyZFBhZ2Vfc2VsZWN0LCBpbml0aWFsUGF0aCk7DQotCQkJaWYgKHNlbGVjdGVkUGF0aCAhPSBudWxsKSB7DQotCQkJCXBhdGhUZXh0LnNldFRleHQoc2VsZWN0ZWRQYXRoLnRvU3RyaW5nKCkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFNldHRpbmcoKSANCi0Jew0KLQkJaWYgKGRlZmF1bHRCdXR0b24gIT0gbnVsbCAmJiBkZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWlmIChwYXRoVGV4dCAhPSBudWxsKSB7DQotCQkJU3RyaW5nIG5hbWUgPSBnZXRGaWVsZENvbnRlbnQocGF0aFRleHQuZ2V0VGV4dCgpKTsNCi0JCQlpZiAobmFtZSA9PSBudWxsKSB7DQotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5QQlNDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkKTsgDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBzdHlsZQ0KLQkgKiBAcGFyYW0gc3BhY2UNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJvdGVjdGVkIEdyaWREYXRhIHNwYW5HcmlkRGF0YShpbnQgc3R5bGUsIGludCBzcGFjZSkgDQotCXsNCi0JCUdyaWREYXRhIGdkID0gbnVsbDsNCi0JCWlmIChzdHlsZSA9PSAtMSkNCi0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZWxzZQ0KLQkJCWdkID0gbmV3IEdyaWREYXRhKHN0eWxlKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhY2U7DQotCQlyZXR1cm4gZ2Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFnZSgpIA0KLQl7DQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7DQotCQlzZXRNZXNzYWdlKG51bGwpOw0KLQkNCi0JCWlmICghaXNWYWxpZFNldHRpbmcoKSkgew0KLQkJCXNldFZhbGlkKGZhbHNlKTsNCi0JCX0gZWxzZSB7CQ0KLQkJCXBlcmZvcm1PaygpOw0KLQkJCXNldFZhbGlkKHRydWUpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL3dpemFyZHMvUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ucGJzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vcGJzL3VpL3dpemFyZHMvUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjOTc3Yi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3Bicy91aS93aXphcmRzL1BCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5wYnMudWkud2l6YXJkczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnBicy51aS5tZXNzYWdlcy5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS51aS53aXphcmRzLkFic3RyYWN0UmVtb3RlUHJveHlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuSVJNQ29uZmlndXJhdGlvbldpemFyZDsNCi0NCi1wdWJsaWMgZmluYWwgY2xhc3MgUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcw0KLQlBYnN0cmFjdFJlbW90ZVByb3h5UmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2Ugew0KLQkNCi0JcHVibGljIFBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKElSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7DQotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLlBCU1Jlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX25hbWUpOw0KLQkJc2V0VGl0bGUoTWVzc2FnZXMuUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGUpOw0KLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuUEJTUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzY3JpcHRpb24pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTU5NjcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLy5wcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTYxY2M1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmU8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzI5MDUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQ0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5BY3RpdmF0b3INCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXINCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5zZWFyY2gsDQotIG9yZy5lY2xpcHNlLnVpLA0KLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLA0KLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLA0KLSBvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wsDQotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLA0KLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmU7YnVuZGxlLXZlcnNpb249IjIuMS4wIg0KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlDQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5ybXN5c3RlbQ0KLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvYWJvdXQuaHRtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA2ZjNhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5BYm91dDwvdGl0bGU+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+DQotIA0KLTxwPkFwcmkgMTQsIDIwMDk8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyMDM3NS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZkN2QwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgU0xVUk0gQ29yZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9wbHVnaW4ueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTQzMDEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/Pg0KLTxwbHVnaW4+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9BY3RpdmF0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmZmMjMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4gew0KLQ0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUiOw0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgQWN0aXZhdG9yKCkgew0KLQkJcGx1Z2luID0gdGhpczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9TTFVSTUF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxYzkwMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTTFVSTUF0dHJpYnV0ZXMgew0KLQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNSm9iQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9TTFVSTUpvYkF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1MzA2ZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNSm9iQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBKb2IgYXR0cmlidXRlcwotICovCi1wdWJsaWMgY2xhc3MgU0xVUk1Kb2JBdHRyaWJ1dGVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNX05PREVTX0FUVFJfSUQgPSAibnVtYmVyT2ZOb2RlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRV9MSU1JVF9BVFRSX0lEID0gInRpbWVMaW1pdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG51bU5vZGVzQXR0ckRlZiA9IAotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oTlVNX05PREVTX0FUVFJfSUQsICJOb2RlcyIsICAvLyROT04tTkxTLTEkCi0JCQkJTWVzc2FnZXMuU0xVUk1Kb2JBdHRyaWJ1dGVzXzAsIHRydWUsIDEpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gdGltZUxpbWl0QXR0ckRlZiA9IAotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oVElNRV9MSU1JVF9BVFRSX0lELCAiVGltZUxpbWl0IiwgIC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlcy5TTFVSTUpvYkF0dHJpYnV0ZXNfMSwgdHJ1ZSwgMSk7Ci0KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltdewotCQkJCW51bU5vZGVzQXR0ckRlZiwKLQkJCQl0aW1lTGltaXRBdHRyRGVmLAotCQkJfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE51bWJlck9mTm9kZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gbnVtTm9kZXNBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0VGltZUxpbWl0QXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRpbWVMaW1pdEF0dHJEZWY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9TTFVSTVByZWZlcmVuY2VNYW5hZ2VyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNUHJlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlMWM0MC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNUHJlZmVyZW5jZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb3h5T3B0aW9uczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS51aS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOw0KLQ0KLXB1YmxpYyBjbGFzcyBTTFVSTVByZWZlcmVuY2VNYW5hZ2VyIHsNCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfRVhFQ1VUQUJMRV9OQU1FID0gInB0cF9zbHVybV9wcm94eS5weSI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9FWEVDVVRBQkxFX1BBVEggPSBudWxsOyAvLyB1c2UgbG9jYWwgZnJhZ21lbnQgZGlyZWN0b3J5DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUFRJT05TID0gSVJlbW90ZVByb3h5T3B0aW9ucy5QT1JUX0ZPUldBUkRJTkc7DQotCQ0KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0T3B0aW9ucygpIHsNCi0JCXJldHVybiBPUFRJT05TOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQcm94eUV4ZWN1dGFibGVQYXRoKCkgew0KLQkJcmV0dXJuIFBST1hZX0VYRUNVVEFCTEVfUEFUSDsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgew0KLQkJcmV0dXJuIEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsNCi0JCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJlZmVyZW5jZXMoKSB7DQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsNCi0JCQ0KLQkJU3RyaW5nIHNlcnZlciA9ICIiOw0KLQkJCQ0KLQkJaWYgKFBST1hZX0VYRUNVVEFCTEVfUEFUSCAhPSBudWxsKSB7DQotCQkJLy9zZXJ2ZXIgPSBuZXcgUGF0aChQUk9YWV9FWEVDVVRBQkxFX1BBVEgpLmFwcGVuZChQUk9YWV9FWEVDVVRBQkxFX05BTUUpLnRvT1NTdHJpbmcoKTsNCi0JCX0gZWxzZSB7DQotCQkJLy9zZXJ2ZXIgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5sb2NhdGVGcmFnbWVudEZpbGUoIm9yZy5lY2xpcHNlLnB0cCIsIFBST1hZX0VYRUNVVEFCTEVfTkFNRSk7DQotCQkJaWYgKHNlcnZlciA9PSBudWxsKSB7DQotCQkJCXNlcnZlciA9ICIiOw0KLQkJCX0NCi0gICAgICAgfQ0KLQkJDQotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfUEFUSCwgc2VydmVyKTsNCi0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05TLCBPUFRJT05TKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjg5YjUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUubWVzc2FnZXM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotDQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUpvYkF0dHJpYnV0ZXNfMDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Kb2JBdHRyaWJ1dGVzXzE7DQotCQ0KLQlzdGF0aWMgew0KLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgew0KLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuDQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWU4NjkwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotU0xVUk1Kb2JBdHRyaWJ1dGVzXzA9TnVtYmVyIG9mIE5vZGVzDQotU0xVUk1Kb2JBdHRyaWJ1dGVzXzE9Sm9iIFRpbWUgTGltaXQNCi0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3Jtc3lzdGVtL0lTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcm1zeXN0ZW0vSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNhMTZmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcm1zeXN0ZW0vSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuSVJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIElSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNsdXJtZEFyZ3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNsdXJtZEFyZ3MoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNsdXJtZFBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNsdXJtZFBhdGgoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB1c2VEZWZhdWx0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFVzZURlZmF1bHRzKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2x1cm1kQXJndW1lbnRzCi0JICogICAgICAgICAgICB0aGUgc2x1cm1kQXJncyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbHVybWRBcmdzKFN0cmluZyBzbHVybWRBcmdzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2x1cm1kUGF0aAotCSAqICAgICAgICAgICAgdGhlIHNsdXJtZFBhdGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2x1cm1kUGF0aChTdHJpbmcgc2x1cm1kUGF0aCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXNlRGVmYXVsdHMKLQkgKiAgICAgICAgICAgIHRoZSB1c2VEZWZhdWx0cyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0cyhib29sZWFuIHVzZURlZmF1bHRzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3Jtc3lzdGVtL1NMVVJNUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3Jtc3lzdGVtL1NMVVJNUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjIyY2QuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ybXN5c3RlbS9TTFVSTVJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJtc3lzdGVtOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTm9kZUNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucnRzeXN0ZW0uU0xVUk1Qcm94eVJ1bnRpbWVDbGllbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJ0c3lzdGVtLlNMVVJNUnVudGltZVN5c3RlbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVTeXN0ZW07DQotDQotcHVibGljIGNsYXNzIFNMVVJNUmVzb3VyY2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyIHsNCi0NCi0JcHJpdmF0ZSBJbnRlZ2VyIFNMVVJNUk1JRDsNCi0JDQotCXB1YmxpYyBTTFVSTVJlc291cmNlTWFuYWdlcihJbnRlZ2VyIGlkLCBJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSwgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7DQotCQlzdXBlcihpZC50b1N0cmluZygpLCB1bml2ZXJzZSwgY29uZmlnKTsNCi0JCVNMVVJNUk1JRCA9IGlkOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RQcm94eVJlc291cmNlTWFuYWdlciNkb0FmdGVyQ2xvc2VDb25uZWN0aW9uKCkNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRvQWZ0ZXJDbG9zZUNvbm5lY3Rpb24oKSB7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQWZ0ZXJPcGVuQ29ubmVjdGlvbigpDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBkb0FmdGVyT3BlbkNvbm5lY3Rpb24oKSB7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQmVmb3JlQ2xvc2VDb25uZWN0aW9uKCkNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRvQmVmb3JlQ2xvc2VDb25uZWN0aW9uKCkgew0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RQcm94eVJlc291cmNlTWFuYWdlciNkb0JlZm9yZU9wZW5Db25uZWN0aW9uKCkNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRvQmVmb3JlT3BlbkNvbm5lY3Rpb24oKSB7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVKb2Iob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQUXVldWVDb250cm9sLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElQSm9iQ29udHJvbCBkb0NyZWF0ZUpvYihJUFF1ZXVlQ29udHJvbCBxdWV1ZSwgU3RyaW5nIGpvYklkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gbmV3Sm9iKHF1ZXVlLCBqb2JJZCwgYXR0cnMpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlTWFjaGluZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElQTWFjaGluZUNvbnRyb2wgZG9DcmVhdGVNYWNoaW5lKFN0cmluZyBtYWNoaW5lSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiBuZXdNYWNoaW5lKG1hY2hpbmVJZCwgYXR0cnMpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlTm9kZShvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJUE5vZGVDb250cm9sIGRvQ3JlYXRlTm9kZShJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIFN0cmluZyBub2RlSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiBuZXdOb2RlKG1hY2hpbmUsIG5vZGVJZCwgYXR0cnMpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlUHJvY2VzcyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElQUHJvY2Vzc0NvbnRyb2wgZG9DcmVhdGVQcm9jZXNzKElQSm9iQ29udHJvbCBqb2IsIFN0cmluZyBwcm9jZXNzSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiBuZXdQcm9jZXNzKGpvYiwgcHJvY2Vzc0lkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVRdWV1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElQUXVldWVDb250cm9sIGRvQ3JlYXRlUXVldWUoU3RyaW5nIHF1ZXVlSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiBuZXdRdWV1ZShxdWV1ZUlkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVSdW50aW1lU3lzdGVtKCkNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVJ1bnRpbWVTeXN0ZW0gZG9DcmVhdGVSdW50aW1lU3lzdGVtKCkgew0KLQkJSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSAoSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOw0KLQkJLyogbG9hZCB1cCB0aGUgY29udHJvbCBhbmQgbW9uaXRvcmluZyBzeXN0ZW1zIGZvciBPTVBJICovDQotCQlTTFVSTVByb3h5UnVudGltZUNsaWVudCBydW50aW1lUHJveHkgPSBuZXcgU0xVUk1Qcm94eVJ1bnRpbWVDbGllbnQoY29uZmlnLCBTTFVSTVJNSUQpOw0KLQkJcmV0dXJuIG5ldyBTTFVSTVJ1bnRpbWVTeXN0ZW0ocnVudGltZVByb3h5LCBnZXRBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcigpKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZUpvYnMob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZUpvYnMoSVBRdWV1ZUNvbnRyb2wgcXVldWUsIENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBqb2JzLA0KLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiB1cGRhdGVKb2JzKHF1ZXVlLCBqb2JzLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVNYWNoaW5lcyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlTWFjaGluZXMoQ29sbGVjdGlvbjxJUE1hY2hpbmVDb250cm9sPiBtYWNoaW5lcywNCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlTWFjaGluZXMobWFjaGluZXMsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZU5vZGVzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlTm9kZXMoSVBNYWNoaW5lQ29udHJvbCBtYWNoaW5lLCANCi0JCQlDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IG5vZGVzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlTm9kZXMobWFjaGluZSwgbm9kZXMsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZVByb2Nlc3NlcyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlUHJvY2Vzc2VzKElQSm9iQ29udHJvbCBqb2IsDQotCQkJQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiB1cGRhdGVQcm9jZXNzZXMoam9iLCBwcm9jZXNzZXMsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZVF1ZXVlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlUXVldWVzKENvbGxlY3Rpb248SVBRdWV1ZUNvbnRyb2w+IHF1ZXVlcywNCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlUXVldWVzKHF1ZXVlcywgYXR0cnMpOw0KLQl9DQotIAkNCi0gCS8qIChub24tSmF2YWRvYykNCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZVJNKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0gCSAqLw0KLSAJQE92ZXJyaWRlDQotIAlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZVJNKEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0gCQlyZXR1cm4gdXBkYXRlUk0oYXR0cnMpOw0KLSAJfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlDb21tYW5kRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ydHN5c3RlbS9TTFVSTVByb3h5Q29tbWFuZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmZDgxNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJ0c3lzdGVtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlDb21tYW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lRmlsdGVyRXZlbnRzQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lSW5pdENvbW1hbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgU0xVUk1Qcm94eUNvbW1hbmRGYWN0b3J5IGltcGxlbWVudHMgSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5IHsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0xVUk1EX1BBVEhfQVRUUiA9ICJzbHVybWRQYXRoIjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTTFVSTURfQVJHU19BVFRSID0gInNsdXJtZEFyZ3MiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5IGZhY3Rvcnk7DQotCXByaXZhdGUgSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWc7DQotDQotCXB1YmxpYyBTTFVSTVByb3h5Q29tbWFuZEZhY3RvcnkoSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsNCi0JCXRoaXMuZmFjdG9yeSA9IG5ldyBQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSgpOw0KLQkJdGhpcy5jb25maWcgPSBjb25maWc7DQotCX0NCi0JDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVGaWx0ZXJFdmVudHNDb21tYW5kKGphdmEubGFuZy5TdHJpbmdbXSkNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lRmlsdGVyRXZlbnRzQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVGaWx0ZXJFdmVudHNDb21tYW5kKFN0cmluZ1tdIGFyZ3MpIHsNCi0JCXJldHVybiBmYWN0b3J5Lm5ld1Byb3h5UnVudGltZUZpbHRlckV2ZW50c0NvbW1hbmQoYXJncyk7DQotCX0NCi0JDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVJbml0Q29tbWFuZChpbnQpDQotCSAqLw0KLQlwdWJsaWMgSVByb3h5UnVudGltZUluaXRDb21tYW5kIG5ld1Byb3h5UnVudGltZUluaXRDb21tYW5kKGludCBiYXNlSWQpIHsNCi0JCUlQcm94eVJ1bnRpbWVJbml0Q29tbWFuZCBjbWQgPSBmYWN0b3J5Lm5ld1Byb3h5UnVudGltZUluaXRDb21tYW5kKGJhc2VJZCk7DQotCQlpZiAoIWNvbmZpZy5nZXRVc2VEZWZhdWx0cygpKSB7DQotCQkJaWYgKCFjb25maWcuZ2V0U2x1cm1kUGF0aCgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQljbWQuYWRkQXJndW1lbnQoU0xVUk1EX1BBVEhfQVRUUiArICI9IiArIGNvbmZpZy5nZXRTbHVybWRQYXRoKCkpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCWlmICghY29uZmlnLmdldFNsdXJtZEFyZ3MoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJZm9yIChTdHJpbmcgYXJnIDogY29uZmlnLmdldFNsdXJtZEFyZ3MoKS5zcGxpdCgiICIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCWNtZC5hZGRBcmd1bWVudChTTFVSTURfQVJHU19BVFRSICsgIj0iICsgYXJnKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGNtZDsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkjbmV3UHJveHlSdW50aW1lTW9kZWxEZWZDb21tYW5kKCkNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lTW9kZWxEZWZDb21tYW5kIG5ld1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCgpIHsNCi0JCXJldHVybiBmYWN0b3J5Lm5ld1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCgpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQoKQ0KLQkgKi8NCi0JcHVibGljIElQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQgbmV3UHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKCkgew0KLQkJcmV0dXJuIGZhY3RvcnkubmV3UHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKCk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5I25ld1Byb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kKCkNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQgbmV3UHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQoKSB7DQotCQlyZXR1cm4gZmFjdG9yeS5uZXdQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZCgpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kKGphdmEubGFuZy5TdHJpbmdbXSkNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kKA0KLQkJCVN0cmluZ1tdIGFyZ3MpIHsNCi0JCXJldHVybiBmYWN0b3J5Lm5ld1Byb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQoYXJncyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5I25ld1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQoamF2YS5sYW5nLlN0cmluZykNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kKA0KLQkJCVN0cmluZyBqb2JJZCkgew0KLQkJcmV0dXJuIGZhY3RvcnkubmV3UHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZChqb2JJZCk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLlByb3h5Q29tbWFuZEZhY3RvcnkjdG9Db21tYW5kKG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQuUHJveHlQYWNrZXQpDQotCSAqLw0KLQlwdWJsaWMgSVByb3h5Q29tbWFuZCB0b0NvbW1hbmQoUHJveHlQYWNrZXQgcGFja2V0KSB7DQotCQlyZXR1cm4gZmFjdG9yeS50b0NvbW1hbmQocGFja2V0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlSdW50aW1lQ2xpZW50LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlSdW50aW1lQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzgxMTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ydHN5c3RlbS9TTFVSTVByb3h5UnVudGltZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucnRzeXN0ZW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZUV2ZW50RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS5jb3JlLkFic3RyYWN0UmVtb3RlUHJveHlSdW50aW1lQ2xpZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5ybXN5c3RlbS5JU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBTTFVSTVByb3h5UnVudGltZUNsaWVudCBleHRlbmRzIEFic3RyYWN0UmVtb3RlUHJveHlSdW50aW1lQ2xpZW50IHsNCi0JcHVibGljIFNMVVJNUHJveHlSdW50aW1lQ2xpZW50KElTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnLCANCi0JCQlpbnQgYmFzZU1vZGVsSWQpIHsNCi0JCXN1cGVyKGNvbmZpZywgYmFzZU1vZGVsSWQsIG5ldyBTTFVSTVByb3h5Q29tbWFuZEZhY3RvcnkoY29uZmlnKSwgbmV3IFByb3h5UnVudGltZUV2ZW50RmFjdG9yeSgpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUnVudGltZVN5c3RlbS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ydHN5c3RlbS9TTFVSTVJ1bnRpbWVTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkNTUyYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUnVudGltZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucnRzeXN0ZW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVByb3h5UnVudGltZVN5c3RlbTsNCi0NCi1wdWJsaWMgY2xhc3MgU0xVUk1SdW50aW1lU3lzdGVtIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVTeXN0ZW0gew0KLQlwdWJsaWMgU0xVUk1SdW50aW1lU3lzdGVtKFNMVVJNUHJveHlSdW50aW1lQ2xpZW50IHByb3h5LCBBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBtYW5hZ2VyKSB7DQotCQlzdXBlcihwcm94eSwgbWFuYWdlcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS8uY3Byb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5Ly5jcHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxYjY1OC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5Ly5jcHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9maWxlVmVyc2lvbiA0LjAuMD8+Ci0KLTxjcHJvamVjdCBzdG9yYWdlX3R5cGVfaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLlhtbFByb2plY3REZXNjcmlwdGlvblN0b3JhZ2UiPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIj4KLTxjY29uZmlndXJhdGlvbiBpZD0iMC4xNDUxMDk3OTk5Ij4KLTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiIGlkPSIwLjE0NTEwOTc5OTkiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iRGVmYXVsdCI+Ci08ZXh0ZXJuYWxTZXR0aW5ncy8+Ci08ZXh0ZW5zaW9ucz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLlZDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0FTRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0xERXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuTWFrZUVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KLTwvZXh0ZW5zaW9ucz4KLTwvc3RvcmFnZU1vZHVsZT4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPgotPGNvbmZpZ3VyYXRpb24gYXJ0aWZhY3ROYW1lPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkiIGJ1aWxkUHJvcGVydGllcz0iIiBkZXNjcmlwdGlvbj0iIiBpZD0iMC4xNDUxMDk3OTk5IiBuYW1lPSJEZWZhdWx0IiBwYXJlbnQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnByZWZiYXNlLmNmZyI+Ci08Zm9sZGVySW5mbyBpZD0iMC4xNDUxMDk3OTk5LiIgbmFtZT0iLyIgcmVzb3VyY2VQYXRoPSIiPgotPHRvb2xDaGFpbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUucHJlZmJhc2UudG9vbGNoYWluLjE5Mzk2NjU1NTUiIG5hbWU9Ik5vIFRvb2xDaGFpbiIgcmVzb3VyY2VUeXBlQmFzZWREaXNjb3Zlcnk9ImZhbHNlIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5wcmVmYmFzZS50b29sY2hhaW4iPgotPHRhcmdldFBsYXRmb3JtIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5wcmVmYmFzZS50b29sY2hhaW4uMTkzOTY2NTU1NS4xNDE1MjEzMzE0IiBuYW1lPSIiLz4KLTxidWlsZGVyIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5kZWZhdWx0LmJ1aWxkZXIuMzc5NTAzOTY3IiBrZWVwRW52aXJvbm1lbnRJbkJ1aWxkZmlsZT0iZmFsc2UiIG1hbmFnZWRCdWlsZE9uPSJmYWxzZSIgbmFtZT0iR251IE1ha2UgQnVpbGRlciIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuZGVmYXVsdC5idWlsZGVyIi8+Ci08dG9vbCBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmxpYnMuMTgzNTMxMzQ4MCIgbmFtZT0iaG9sZGVyIGZvciBsaWJyYXJ5IHNldHRpbmdzIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIubGlicyIvPgotPHRvb2wgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci4zNTQyMjY1NjEiIG5hbWU9IkdOVSBDKysiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlciI+Ci08aW5wdXRUeXBlIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlLjkwOTE3Njc4MCIgbGFuZ3VhZ2VJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZysrIiBsYW5ndWFnZU5hbWU9IkdOVSBDKysiIHNvdXJjZUNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5jeHhTb3VyY2Usb3JnLmVjbGlwc2UuY2R0LmNvcmUuY3h4SGVhZGVyIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlIi8+Ci08L3Rvb2w+Ci08dG9vbCBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLjQxOTQxMzAyOSIgbmFtZT0iR05VIEMiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlciI+Ci08aW5wdXRUeXBlIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlLjEzMDE3MzkxMzQiIGxhbmd1YWdlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmdjYyIgbGFuZ3VhZ2VOYW1lPSJHTlUgQyIgc291cmNlQ29udGVudFR5cGU9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmNTb3VyY2Usb3JnLmVjbGlwc2UuY2R0LmNvcmUuY0hlYWRlciIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmluVHlwZSIvPgotPC90b29sPgotPHRvb2wgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci4xMjQ2NDcxNDQ5IiBuYW1lPSJBc3NlbWJseSIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyIj4KLTxpbnB1dFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci5pblR5cGUuMjEzNTIyOTMyNyIgbGFuZ3VhZ2VJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuYXNzZW1ibHkiIGxhbmd1YWdlTmFtZT0iQXNzZW1ibHkiIHNvdXJjZUNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5hc21Tb3VyY2UiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci5pblR5cGUiLz4KLTwvdG9vbD4KLTwvdG9vbENoYWluPgotPC9mb2xkZXJJbmZvPgotPC9jb25maWd1cmF0aW9uPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iMC4xNDUxMDk3OTk5Ij4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4KLTwvY2NvbmZpZ3VyYXRpb24+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KLTxwcm9qZWN0IGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkubnVsbC4xNjQ3NzQ3ODg1IiBuYW1lPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkiLz4KLTwvc3RvcmFnZU1vZHVsZT4KLTwvY3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5Ly5wcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4ZDg0My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuZ2VubWFrZWJ1aWxkZXI8L25hbWU+Ci0JCQk8dHJpZ2dlcnM+Y2xlYW4sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT4/bmFtZT88L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYXBwZW5kX2Vudmlyb25tZW50PC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5hdXRvQnVpbGRUYXJnZXQ8L2tleT4KLQkJCQkJPHZhbHVlPmFsbDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGRBcmd1bWVudHM8L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGRDb21tYW5kPC9rZXk+Ci0JCQkJCTx2YWx1ZT5tYWtlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5jbGVhbkJ1aWxkVGFyZ2V0PC9rZXk+Ci0JCQkJCTx2YWx1ZT5jbGVhbjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuY29udGVudHM8L2tleT4KLQkJCQkJPHZhbHVlPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYWN0aXZlQ29uZmlnU2V0dGluZ3M8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUF1dG9CdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+ZmFsc2U8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUNsZWFuQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUZ1bGxCdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZnVsbEJ1aWxkVGFyZ2V0PC9rZXk+Ci0JCQkJCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLnN0b3BPbkVycm9yPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS51c2VEZWZhdWx0QnVpbGRDbWQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLlNjYW5uZXJDb25maWdCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQuY29yZS5jbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUubWFuYWdlZEJ1aWxkTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuU2Nhbm5lckNvbmZpZ05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9BVVRIT1JTIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVkZmEyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvQVVUSE9SUworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUppZSBKaWFuZyA8amlhbmdqaWVAbnVkdC5lZHUuY24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L0NPUFlJTkcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTA1OGYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMDkgU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hIAotCi1UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvQ2hhbmdlTG9nIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9JTlNUQUxMIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9JTlNUQUxMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBjNDJmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVNlZSBSRUFETUUgZm9yIGJ1aWxkL2luc3RhbGwgaW5zdHJ1Y3Rpb25zLgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjVjYTcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLnByb3h5DQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUNyZWF0ZWQtQnk6IDEuNS4wXzEzLTExOSAoQXBwbGUgSW5jLikNCi1CdW5kbGUtTmFtZTogUFRQIFByb3h5IFNlcnZlciBmb3IgT3BlblJURQ0KLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMS4yMDA4MDYwNjE1MTUNCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZw0KLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnB0cC51dGlscyxvcmcuZWNsaXBzZS5wdHAucHJveHkNCi0NCi1OYW1lOiBjb25maWd1cmUuaW4NCi1TSEExLURpZ2VzdDogNnpFYjdnbGtDKzhyZHd3cnhBNUtERlVPZ3lJPQ0KLQ0KLU5hbWU6IE1ha2VmaWxlLmFtDQotU0hBMS1EaWdlc3Q6IFJPSFl1YmdId0JZVFZQSVhUTmh1NFIxMTJsOD0NCi0NCi1OYW1lOiBjb25maWd1cmUNCi1TSEExLURpZ2VzdDogYXhDZVAxVGxJTksrN3dTNWxIWDIwMFJJV0tnPQ0KLQ0KLU5hbWU6IENoYW5nZUxvZw0KLVNIQTEtRGlnZXN0OiAyam1qN2w1clN3MHlWYi92bFdBWWtLL1lCd2s9DQotDQotTmFtZTogSU5TVEFMTA0KLVNIQTEtRGlnZXN0OiB1czBlMDcwVHU0Z1huK25xd2lmaUxPR3BiSVE9DQotDQotTmFtZTogYWJvdXQuaHRtbA0KLVNIQTEtRGlnZXN0OiA2N3RSN3pEZzV6WlRTcWt5MUhhdlNyYytJWTA9DQotDQotTmFtZTogY29tcGlsZQ0KLVNIQTEtRGlnZXN0OiA5eVp0cnRyY0drdmhia2J5Vkp1RXR3endKOWM9DQotDQotTmFtZTogTWFrZWZpbGUuaW4NCi1TSEExLURpZ2VzdDogeE92MlorNmVOMmVRVG1sV0tvZ3VmZGtMb2lrPQ0KLQ0KLU5hbWU6IENPUFlJTkcNCi1TSEExLURpZ2VzdDogcVBnK1ZzbGlUVEJ1OVBqNWxRekdPeU5ONjFJPQ0KLQ0KLU5hbWU6IHNyYy9wdHBfb3J0ZV9wcm94eS5jDQotU0hBMS1EaWdlc3Q6IGMyNllYQ0tteW1raXVkaUY4ZzY3N0pwbTRtST0NCi0NCi1OYW1lOiBsdG1haW4uc2gNCi1TSEExLURpZ2VzdDogRlJiVklXc3k3WDNXVzZibVNjMVlaWDdraXJrPQ0KLQ0KLU5hbWU6IGRlcGNvbXANCi1TSEExLURpZ2VzdDogWFhRbHFjQ0tac01YZng0eEtHK2tDWWIveVpZPQ0KLQ0KLU5hbWU6IEFVVEhPUlMNCi1TSEExLURpZ2VzdDogNVVSSHZnT0ZNRnRMZXFQZ3dxRm9xQUVpamkwPQ0KLQ0KLU5hbWU6IE5FV1MNCi1TSEExLURpZ2VzdDogMmptajdsNXJTdzB5VmIvdmxXQVlrSy9ZQndrPQ0KLQ0KLU5hbWU6IG1pc3NpbmcNCi1TSEExLURpZ2VzdDogaE9GSld1dmhCTHBvOFNTOE5nYkxTaHRmYkhvPQ0KLQ0KLU5hbWU6IHNyYy9vcnRlX2ZpeHVwLmgNCi1TSEExLURpZ2VzdDogempmMnRPUFpFUE9hSE5uNUZXUCszcFlOVmxvPQ0KLQ0KLU5hbWU6IGFjbG9jYWwubTQNCi1TSEExLURpZ2VzdDogLzM2ajRldTJRLytpTXlDbGhqOFFFa1dIcUgwPQ0KLQ0KLU5hbWU6IGluc3RhbGwtc2gNCi1TSEExLURpZ2VzdDogS3hnbDRVUkQ4eG1BcUtPb0J4MnoxZ2ppVEUwPQ0KLQ0KLU5hbWU6IFJFQURNRQ0KLVNIQTEtRGlnZXN0OiAzSE5DemlJRkRHODg1N1djU005WTBZbThuQUU9DQotDQotTmFtZTogY29uZmlnLmguaW4NCi1TSEExLURpZ2VzdDogWmc5TUZpcDZERDlua04rU211M2VHa3Fld3RNPQ0KLQ0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mDQotU0hBMS1EaWdlc3Q6IDA5Z04wNXRvYmdTL01kdHF5VE5RaE9oQjczTT0NCi0NCi1OYW1lOiBjb25maWcuc3ViDQotU0hBMS1EaWdlc3Q6IGJpeHZPZ0pyU2hqY1ZUamdqTHBqclhNSkxPMD0NCi0NCi1OYW1lOiBjb25maWcuc3RhdHVzDQotU0hBMS1EaWdlc3Q6IG5ZVUpnZHhhd1piQVVUOFBubjUzbEFxRlgyVT0NCi0NCi1OYW1lOiBjb25maWcuZ3Vlc3MNCi1TSEExLURpZ2VzdDogc1dDTzFER0lIWnNBY0FWMjJtKzM1cUtPZGdVPQ0KLQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmZmZWQyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTUVUQS1JTkYvZWNsaXBzZS5pbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNQcm9jZXNzZWQgdXNpbmcgSmFycHJvY2Vzc29yCi1wYWNrMjAwLmNvbmRpdGlvbmVkID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9NYWtlZmlsZS5hbSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTQ3YTUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi1iaW5fUFJPR1JBTVMgPQlwdHBfc2x1cm1fcHJveHkKLQotcHRwX3NsdXJtX3Byb3h5X1NPVVJDRVMgPQlzcmMvcHRwX3NsdXJtX3Byb3h5LmMgc3JjL3NydW5fb3B0LmggCi1wdHBfc2x1cm1fcHJveHlfQ0ZMQUdTID0JJChBTV9DRkxBR1MpCi1wdHBfc2x1cm1fcHJveHlfQ1BQRkxBUyA9ICAtSSQoU0xVUk1ESVIpL2luY2x1ZGUKLXB0cF9zbHVybV9wcm94eV9MREZMQUdTID0gLUwkKFNMVVJNRElSKS9saWIKLXB0cF9zbHVybV9wcm94eV9MREFERCA9IAktbHNsdXJtIC1scHRocmVhZApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9ORVdTIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTkVXUworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L1JFQURNRSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2U5YzMwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotVGhpcyBwcm9qZWN0IGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgU0xVUk0gcHJveHkgc2VydmVyLiBUaGUgZm9sbG93aW5nCi1zdGVwcyBhcmUgdXNlZCB0byBzZXQgdXAgeW91ciBidWlsZCBlbnZpcm9ubWVudCBzbyB0aGF0IHRoZSBleGVjdXRhYmxlIHdpbGwgYmUKLWNvcnJlY3RseSBidWlsdCBhbmQgaW5zdGFsbGVkLiBJbiBvcmRlciB0byB1c2UgdGhlIHNlcnZlciBiaW5hcnksIGl0IG5lZWRzIHRvIAotYmUgaW5zdGFsbGVkIGluIGEgZnJhZ21lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBtYWNoaW5lIAotaXQgd2lsbCBiZSBydW4gb24uIAotCi0xLiBNYWtlIHN1cmUgdGhlIFNMVVJNIHJtcyBpcyBpbnN0YWxsZWQgYW5kIGVuc3VyZSBpdCB3b3JrIHdlbGwuIAotICAgVGhhdCBpcywgU0xVUk0gY21kIHV0aWxpdGllcywgc3VjaCBhcyAic2luZm8vc3J1bi9zcXVldWUiIHdvcmsgYXMgZXhwZWN0ZWQuCi0gICBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gYnVpbGQgYW5kIGluc3RhbGwgU0xVUk0sIHNlZQotICAgaHR0cDovL3d3dy5sbG5sLmdvdi9saW51eC9zbHVybS9zbHVybS5odG1sCi0KLQotMi4gRG93bmxvYWQgUFRQIDIuMSBmb3IgeW91ciBwbGF0Zm9ybS4gQW5kIG1vZGlmeSBwcm94eV9hdHRyLmggdXNpbmcgbGlicHJveHkucGF0Y2g6Ci0gICAoMSkgY29weSBsaWJwcm94eS5wYXRjaCB0byAkUFRQRElSL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ci0gICAoMikgY2QgJFBUUERJUi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eQotICAgKDMpIHBhdGNoIC1wMSA8IGxpYnByb3h5LnBhdGNoCi0KLQotMy4gQnVpbGQgdGhlIGNvcnJlc3BvbmRpbmcgInByb3h5IiBhbmQgInV0aWxzIiBsaWJyYXJpZXMgaW4gJFBUUERJUi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eSAKLSAgIGFuZCAkUFRQRElSL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzIGRpcmVjdG9yeSB1c2luZyAnY29uZmlndXJlJywgJ21ha2UnIGFuZCAnbWFrZSBpbnN0YWxsJyBjb21tYW5kcy4KLQotCi00LiBVc2UgJ2NvbmZpZ3VyZScsICdtYWtlJyBhbmQgJ21ha2UgaW5zdGFsbCcgd2l0aGluIHRoaXMgZGlyZWN0b3J5IGZyb20KLSAgIHRoZSBjb21tYW5kIGxpbmUgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIGV4ZWN1dGFibGUuCi0gICBOT1RFOiBUaGUgJ2NvbmZpZ3VyZScgY29tbWFuZCBNVVNUIHJlcXVpcmUgJy0td2l0aC1zbHVybScgb3B0aW9uIHRvIHNwZWNpZnkgdGhlCi0gICB0b3AgaW5zdGFsbCBkaXJlY3Rvcnkgb2YgU0xVUk0uIElmIHN1Y2ggb3B0aW9uIGlzIG1pc3NlZCwgdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIHdpbGwgZmFpbC4KLQotCi01LiBJZiBhbnkgb2YgdGhlIGF1dG9tYWtlL2F1dG9jb25mIGZpbGVzIGNoYW5nZXMsIHlvdSBzaG91bGQganVzdCBuZWVkIHRvCi0gICBydW4gJ2F1dG9yZWNvbmYnIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgZmlsZXMuCi0KLQotCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2NvbmZpZy5oLmluIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9jb25maWcuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3MTM0ZC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2NvbmZpZy5oLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9JTlRUWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHJveHlzdnInIGxpYnJhcnkgKC1scHJveHlzdnIpLiAqLwotI3VuZGVmIEhBVkVfTElCUFJPWFlTVlIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbHVybScgbGlicmFyeSAoLWxzbHVybSkuICovCi0jdW5kZWYgSEFWRV9MSUJTTFVSTQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHV0aWxzJyBsaWJyYXJ5ICgtbHV0aWxzKS4gKi8KLSN1bmRlZiBIQVZFX0xJQlVUSUxTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTUVNT1JZX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzbHVybS9zbHVybV9lcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NMVVJNX1NMVVJNX0VSUk5PX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzbHVybS9zbHVybS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NMVVJNX1NMVVJNX0gKLQotLyogRW5hYmxlIFNMVVJNIHJtcyBzdXBwb3J0LiAqLwotI3VuZGVmIEhBVkVfU1JVTgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURElOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVEFUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCi0jdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PCi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCi0jdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9TVFJJTkcKLQotLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KLSN1bmRlZiBSRVRTSUdUWVBFCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9jb25maWd1cmUuaW4gYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhNTUwNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLWRubAotZG5sCi0KLUFDX1BSRVJFUShbMi41MF0pCi0KLUFDX0lOSVQoW29yZy5lY2xpcHNlLnB0cC5zbHVybV0sIFsyLjFdKQotQUNfQ09ORklHX1NSQ0RJUihbc3JjL3B0cF9zbHVybV9wcm94eS5jXSkKLQotQU1fSU5JVF9BVVRPTUFLRShbLVdhbGwgLVdlcnJvciBmb3JlaWduXSkKLQotQUNfQ0FOT05JQ0FMX0JVSUxECi0KLWRubAotZG5sIEVjbGlwc2UgYWRkcyB2ZXJzaW9uIG51bWJlciB0byBlbmQgb2YgcGFja2FnZSB3aGVuIGRlcGxveWluZyB2aWEgdXBkYXRlIHNpdGUKLWRubAotCi1VVElMUz0iLi4vLi4vY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMiCi1pZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JVVRJTFM9ImBlY2hvICR7VVRJTFN9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JCUFDX01TR19FUlJPUihbdXRpbHMgZGlyZWN0b3J5IG5vdCBmb3VuZF0pCi0JZmkKLWZpCi0KLVBST1hZPSIuLi8uLi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eSIKLWlmIHRlc3QgISAtZCAkUFJPWFk7IHRoZW4KLQlQUk9YWT0iYGVjaG8gJHtQUk9YWX1fJHtQQUNLQUdFX1ZFUlNJT059LipgIgotCWlmIHRlc3QgISAtZCAkUFJPWFk7IHRoZW4KLQkJQUNfTVNHX0VSUk9SKFtwcm94eSBkaXJlY3Rvcnkgbm90IGZvdW5kXSkKLQlmaQotZmkKLQotZG5sIFNMVVJNCi0KLUFDX0FSR19XSVRIKFtzbHVybV0sIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtc2x1cm1dLAotCVtTcGVjaWZ5IHRoZSB0b3AgZGlyIG9mIGluc3RhbGxlZCBTTFVSTSBybXMuQDw6QFJFUVVJUkVEQDo+QF0pLFtdLFt3aXRoX3NsdXJtPW5vXSkKLQotU0xVUk1ESVI9Ci1BU19JRihbdGVzdCAieCR3aXRoX3NsdXJtIiAhPSB4bm9dLFtBQ19TVUJTVChbU0xVUk1ESVJdLFskd2l0aF9zbHVybV0pXSwKLSAgICAgICBBQ19NU0dfRVJST1IoW1RoZSB0b3AgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBTTFVSTSBybXMgbXVzdCBiZSBzcGVjaWZpZWQgdmlhICItLXdpdGgtc2x1cm09RElSIi5dKSkKLQotCi1kbmwKLWRubCBDaGVjayBmb3IgcHJvZ3JhbXMuCi1kbmwKLQotQUNfUFJPR19DQwotQU1fUFJPR19DQ19DX08KLUFDX1BST0dfSU5TVEFMTAotQUNfUFJPR19NQUtFX1NFVAotQUNfUFJPR19SQU5MSUIKLQotQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIC1JJFVUSUxTL2luY2x1ZGUgLUkkUFJPWFkvaW5jbHVkZSAtSSRTTFVSTURJUi9pbmNsdWRlIgotTElCUz0iJExJQlMgLUwkVVRJTFMgLUwkUFJPWFkgLUwkU0xVUk1ESVIvbGliIgotQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRTTFVSTURJUi9pbmNsdWRlIgotCi1kbmwKLWRubCBDaGVjayBmb3IgbGlicmFyaWVzLgotZG5sCi0KLUFDX0NIRUNLX0xJQihbdXRpbHNdLCBbYml0c2V0X25ld10pCi1BQ19DSEVDS19MSUIoW3Byb3h5c3ZyXSwgW3Byb3h5X3N2cl9pbml0XSkKLUFDX0NIRUNLX0xJQihbc2x1cm1dLFtzbHVybV9waW5nXSxbXSwKLQkJCVtBQ19NU0dfRVJST1IoW2xpYnNsdXJtLnNvLy5hIG5vdCBmb3VuZC4gTWFrZSBzdXJlIC0td2l0aC1zbHVybSBzcGVjaWZ5IGNvcnJlY3QgZGlyLl0pXSkKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcy4KLWRubAotCi1BQ19IRUFERVJfU1REQwotQUNfQ0hFQ0tfSEVBREVSUyhbc2x1cm0vc2x1cm0uaCBzbHVybS9zbHVybV9lcnJuby5oXSxbXSwKLQkJCQlbQUNfTVNHX0VSUk9SKFtzbHVybS5oIG9yIHNsdXJtX2Vycm5vLmggbm90IGZvdW5kXSldKQotCi1kbmwKLWRubCBDaGVjayBmb3IgdHlwZXMKLWRubAotQUNfVFlQRV9TSUdOQUwKLQotQUNfUEFUSF9QUk9HKFNSVU4sIFtzcnVuXSwgbm8pCi1pZiB0ZXN0ICIkYWNfY3ZfcGF0aF9TUlVOIiAhPSBubzsgdGhlbgotCUFDX0RFRklORShbSEFWRV9TUlVOXSxbMV0sW0VuYWJsZSBTTFVSTSBybXMgc3VwcG9ydC5dKQotZWxzZQotCUFDX01TR19FUlJPUihbc3J1biBjb21tYW5kIG5vdCBmb3VuZC4gTWFrZSBzdXJlIFNMVVJNIHJtcyBpbnN0YWxsZWQuXSkKLWZpCi0KLQotQUNfQ09ORklHX0hFQURFUlMoW2NvbmZpZy5oXSkKLUFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGVdKQotQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2xpYnByb3h5LnBhdGNoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9saWJwcm94eS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MGE0NS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L2xpYnByb3h5LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotZGlmZiAtdU5yIG9yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X2F0dHIuaCBvcmcuZWNsaXBzZS5wdHAucHJveHlfc2x1cm0vaW5jbHVkZS9wcm94eV9hdHRyLmgKLS0tLSBvcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9hdHRyLmgJMjAwOS0wNC0xNCAxNTowODoyOS4wMDAwMDAwMDAgKzA4MDAKLSsrKyBvcmcuZWNsaXBzZS5wdHAucHJveHlfc2x1cm0vaW5jbHVkZS9wcm94eV9hdHRyLmgJMjAwOS0wNC0xNCAxNToxMjo0MC4wMDAwMDAwMDAgKzA4MDAKLUBAIC01NiwxMCArNTYsMTIgQEAKLSAgKiBOb2RlIGF0dHJpYnV0ZXMKLSAgKi8KLSAjZGVmaW5lIE5PREVfU1RBVEVfQVRUUgkJCQkibm9kZVN0YXRlIgotKyNpZm5kZWYgSEFWRV9TTFVSTV9TTFVSTV9ICi0gI2RlZmluZSAJTk9ERV9TVEFURV9VUAkJCQkiVVAiCi0gI2RlZmluZSAJTk9ERV9TVEFURV9ET1dOCQkJCSJET1dOIgotICNkZWZpbmUgCU5PREVfU1RBVEVfRVJST1IJCQkiRVJST1IiCi0gI2RlZmluZSAJTk9ERV9TVEFURV9VTktOT1dOCQkJIlVOS05PV04iCi0rI2VuZGlmCi0gI2RlZmluZSBOT0RFX05VTUJFUl9BVFRSCQkJIm5vZGVOdW1iZXIiCi0gI2lmZGVmIEhBVkVfU1lTX0JQUk9DX0gKLSAjZGVmaW5lIE5PREVfR1JPVVBfQVRUUgkJCQkibm9kZUdyb3VwIgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9zcmMvcHRwX3NsdXJtX3Byb3h5LmMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L3NyYy9wdHBfc2x1cm1fcHJveHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4Mjg4OC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L3NyYy9wdHBfc2x1cm1fcHJveHkuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSAKLSAqIFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYQotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCQlKaWUgSmlhbmcgPGppYW5namllQG51ZHQuZWR1LmNuPgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBTTFVSTV9QUk9YWQotI2RlZmluZSBTTFVSTV9QUk9YWSAKLSNlbmRpZiAKLQotCi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Z3JwLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4gICAgICAgCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X3RjcC5oIgotI2luY2x1ZGUgImhhbmRsZXIuaCIKLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiYXJncy5oIgotI2luY2x1ZGUgInJhbmdlc2V0LmgiCi0jaW5jbHVkZSAic2x1cm0vc2x1cm0uaCIKLSNpbmNsdWRlICJzcnVuX29wdC5oIgotCi0KLSNkZWZpbmUgUFRQX0pPQklEIAkJCTAKLSNkZWZpbmUgU0xVUk1fSk9CSUQgCQkxCi0jZGVmaW5lIERFQlVHX0pPQklEIAkJMgotI2RlZmluZSBKT0JJRF9JTklUIAkJCTAKLSNkZWZpbmUgSk9CSURfRkFJTCAJCQktMQotI2RlZmluZSBNQVhfVEhSRUFEUyAJCTYwCi0jZGVmaW5lIENPUkVfSU5WQUxJRCAgIAkJLTEKLSNkZWZpbmUgQ09SRV9ERUZBVUxUIAkJMAotI2RlZmluZSBNQVhfQlVGX1NJWkUgCQk4MTkyIAotI2RlZmluZSBNQVhfU1JVTl9BUkdfTlVNIAkyNTYKLSNkZWZpbmUgQUxMX0pPQlNUQVRFCQktMQotLyoKLSAqIE5lZWQgdG8gdW5kZWYgdGhlc2UgaWYgd2UgaW5jbHVkZQotICogdHdvIGNvbmZpZy5oIGZpbGVzCi0gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotI3VuZGVmIFBBQ0tBR0VfTkFNRQotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0jdW5kZWYgUEFDS0FHRV9WRVJTSU9OCi0KLSNkZWZpbmUgV0lSRV9QUk9UT0NPTF9WRVJTSU9OCSIyLjAiCi0jZGVmaW5lIERFRkFVTFRfSE9TVAkJCSJsb2NhbGhvc3QiCi0jZGVmaW5lIERFRkFVTFRfUFJPWFkJCQkidGNwIgotCi0vKgotICogUHJveHkgc2VydmVyIHN0YXRlcy4gVGhlIFNIVVRUSU5HX0RPV04gc3RhdGUgaXMgdXNlZCB0bwotICogZ2l2ZSB0aGUgcHJveHkgYSBjaGFuY2UgdG8gc2VuZCBhbnkgcGVuZGluZyBldmVudHMgb25jZQotICogYSBRVUlUIGNvbW1hbmQgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gKi8KLSNkZWZpbmUgU1RBVEVfSU5JVAkJCTAKLSNkZWZpbmUgU1RBVEVfUlVOTklORwkJMQotI2RlZmluZSBTVEFURV9TSFVUVElOR19ET1dOCTIKLSNkZWZpbmUgU1RBVEVfU0hVVERPV04JCTMKLQotCi0vKgotICogUlRFViBjb2RlcyBtdXN0IEVYQUNUTFkgbWF0Y2ggb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudAotICovCi0jZGVmaW5lIFJURVZfT0ZGU0VUCQkJCQkJMjAwCi0jZGVmaW5lIFJURVZfRVJST1JfU0xVUk1fSU5JVAkJCVJURVZfT0ZGU0VUICsgMTAwMAotI2RlZmluZSBSVEVWX0VSUk9SX1NMVVJNX0ZJTkFMSVpFCQlSVEVWX09GRlNFVCArIDEwMDEKLSNkZWZpbmUgUlRFVl9FUlJPUl9TTFVSTV9TVUJNSVQJCQlSVEVWX09GRlNFVCArIDEwMDIKLSNkZWZpbmUgUlRFVl9FUlJPUl9KT0IJCQkJCVJURVZfT0ZGU0VUICsgMTAwMwotI2RlZmluZSBSVEVWX0VSUk9SX05BVFRSCQkJCVJURVZfT0ZGU0VUICsgMTAwNwotLy8jZGVmaW5lIFJURVZfRVJST1JfT1JURV9CUFJPQ19TVUJTQ1JJQkUJUlRFVl9PRkZTRVQgKyAxMDA4Ci0jZGVmaW5lIFJURVZfRVJST1JfU0lHTkFMCQkJCVJURVZfT0ZGU0VUICsgMTAwOQotCi0vKgotICogUXVldWUgYXR0cmlidXRlcwotICovCi0jZGVmaW5lIERFRkFVTFRfUVVFVUVfTkFNRQkJCSJkZWZhdWx0IgotI2RlZmluZSBTTFVSTV9KT0JfTkFNRV9GTVQJCQkiam9iJTAyZCIKLQotI2RlZmluZSBNQVhfUkVUUklFUyAJCQkJMTAwCi0jZGVmaW5lIEpPQl9VUERBVEVfVElNRVIgCQkJMQotI2RlZmluZSBOT0RFX1VQREFURV9USU1FUiAJCQkyCi0jZGVmaW5lIEpPQl9VUERBVEVfVElNRU9VVAkJCTUwMDAwMCAJLyp1c2VjKi8KLSNkZWZpbmUgTk9ERV9VUERBVEVfVElNRU9VVAkJCTUwMDAwMDAgLyp1c2VjKi8KLQotLyogU0xVUk0gam9iIHN0YXRlIGFuZCBhdHRyaWJ1dGVzICovCi0jZGVmaW5lCVNMVVJNX0pPQl9TVEFURV9QRU5ESU5HCQkJIlBFTkRJTkciCi0jZGVmaW5lCVNMVVJNX0pPQl9TVEFURV9SVU5OSU5HCQkJIlJVTk5JTkciCi0jZGVmaW5lCVNMVVJNX0pPQl9TVEFURV9TVVNQRU5ERUQJCSJTVVNQRU5ERUQiCi0jZGVmaW5lIFNMVVJNX0pPQl9TVEFURV9URVJNSU5BVEVECQkiVEVSTUlOQVRFRCIKLSNkZWZpbmUJU0xVUk1fSk9CX1NUQVRFX0NPTVBMRVRFCQlTTFVSTV9KT0JfU1RBVEVfVEVSTUlOQVRFRAotI2RlZmluZSBTTFVSTV9KT0JfU1RBVEVfQ0FOQ0VMTEVECQkiQ0FOQ0VMTEVEIgotI2RlZmluZQlTTFVSTV9KT0JfU1RBVEVfRkFJTEVECQkgIAkiRkFJTEVEIgotI2RlZmluZQlTTFVSTV9KT0JfU1RBVEVfVElNRU9VVAkJICAJIlRJTUVPVVQiCi0jZGVmaW5lCVNMVVJNX0pPQl9TVEFURV9OT0RFRkFJTAkJIk5PREVGQUlMIgotCi0jZGVmaW5lIFNMVVJNX0pPQl9TVUJfSURfQVRUUgkJCQkiam9iU3ViSWQiCi0jZGVmaW5lIFNMVVJNX0pPQl9OVU1fUFJPQ1NfQVRUUgkJCSJqb2JOdW1Qcm9jcyIgCS8vLW4KLSNkZWZpbmUgU0xVUk1fSk9CX05VTV9OT0RFU19BVFRSCQkJImpvYk51bU5vZGVzIiAJLy8tTgotI2RlZmluZSBTTFVSTV9KT0JfVElNRV9MSU1JVF9BVFRSCQkJImpvYlRpbWVMaW1pdCIJLy8tdAotI2RlZmluZSBTTFVSTV9KT0JfUEFSVElUSU9OX0FUVFIJCQkiam9iUGFydGl0aW9uIiAJLy8tcAotI2RlZmluZSBTTFVSTV9KT0JfSURfQVRUUgkJCQkJImpvYklkIiAgICAgICAgCS8vLS1qb2JpZAotI2RlZmluZSBTTFVSTV9KT0JfTk9ERUxJU1RfQVRUUgkJCQkiam9iTm9kZUxpc3QiICAJLy8tdwotI2RlZmluZSBTTFVSTV9KT0JfVFlQRV9BVFRSCQkJCQkiam9iVHlwZSIgICAgICAJLy8tLWpvYnR5cGUKLSNkZWZpbmUgU0xVUk1fSk9CX0lPTEFCRUxfQVRUUgkJCQkiam9iSW9MYWJlbCIgICAJLy8tbAotI2RlZmluZSBTTFVSTV9KT0JfVkVSQk9TRV9BVFRSCQkJCSJqb2JWZXJib3NlIiAgIAkvLy12Ci0jZGVmaW5lIFNMVVJNX0pPQl9FWEVDX05BTUVfQVRUUgkJCSJleGVjTmFtZSIKLSNkZWZpbmUgU0xVUk1fSk9CX0VYRUNfUEFUSF9BVFRSCQkJImV4ZWNQYXRoIgotI2RlZmluZSBTTFVSTV9KT0JfV09SS0lOR19ESVJfQVRUUgkJCSJ3b3JraW5nRGlyIgotI2RlZmluZSBTTFVSTV9KT0JfUFJPR19BUkdTX0FUVFIJCQkicHJvZ0FyZ3MiCi0jZGVmaW5lIFNMVVJNX0pPQl9FTlZfQVRUUgkJCQkJImVudiIKLSNkZWZpbmUgU0xVUk1fSk9CX0RFQlVHX0VYRUNfTkFNRV9BVFRSCQkiZGVidWdFeGVjTmFtZSIKLSNkZWZpbmUgU0xVUk1fSk9CX0RFQlVHX0VYRUNfUEFUSF9BVFRSCQkiZGVidWdFeGVjUGF0aCIKLSNkZWZpbmUgU0xVUk1fSk9CX0RFQlVHX0FSR1NfQVRUUgkJCSJkZWJ1Z0FyZ3MiCi0jZGVmaW5lIFNMVVJNX0pPQl9ERUJVR19GTEFHX0FUVFIJCQkiZGVidWciCi0KLS8qIFNMVVJNIG5vZGUgc3RhdGUgYW5kIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgU0xVUk1fTk9ERV9TVEFURV9VTktOT1dOCQkiVU5LTk9XTiIKLSNkZWZpbmUgU0xVUk1fTk9ERV9TVEFURV9ET1dOCQkJIkRPV04iCi0jZGVmaW5lIFNMVVJNX05PREVfU1RBVEVfSURMRQkJCSJVUCIKLSNkZWZpbmUJU0xVUk1fTk9ERV9TVEFURV9BTExPQ0FURUQJCSJBTExPQ0FURUQiCi0jZGVmaW5lIFNMVVJNX05PREVfRVhUUkFfU1RBVEVfQVRUUgkJIm5vZGVFeHRyYVN0YXRlIgotI2RlZmluZSBTTFVSTV9OT0RFX05VTUJFUl9BVFRSCQkJIm5vZGVOdW1iZXIiCi0jZGVmaW5lIFNMVVJNX05PREVfU09DS0VUU19BVFRSCQkJInNvY2tOdW1iZXIiCi0jZGVmaW5lIFNMVVJNX05PREVfQ09SRVNfQVRUUgkJCSJjb3JlTnVtYmVyIgotI2RlZmluZSBTTFVSTV9OT0RFX1RIUkVBRFNfQVRUUgkJCSJ0aHJlYWROdW1iZXIiCi0jZGVmaW5lIFNMVVJNX05PREVfQVJDSF9BVFRSCQkJImNwdUFyY2giCi0jZGVmaW5lIFNMVVJNX05PREVfT1NfQVRUUgkJCQkiT1MiCi0KLSNkZWZpbmUgRVhJVF9KT0JfQUxMT0NfRkFJTAkJLTEKLSNkZWZpbmUgRVhJVF9KT0JfSU9USFJFQURfRkFJTAktMgotI2RlZmluZSBFWElUX0VYRUNfRkFJTAkJCS0zCi0KLQotc3RydWN0IHN5bmNfbXNnIHsKLQlpbnQJCXNsdXJtX2pvYmlkOwotCWJvb2wgCWpvYmlkX3NldDsKLQlib29sCWlvX3JlYWR5OwotfTsKLXR5cGVkZWYgc3RydWN0IHN5bmNfbXNnIHN5bmNfbXNnOwotCi1zdHJ1Y3QgcHRwX21hY2hpbmUgewotCWludAkJaWQ7Ci0JTGlzdCAqCW5vZGVzOwotfTsKLXR5cGVkZWYgc3RydWN0IHB0cF9tYWNoaW5lCXB0cF9tYWNoaW5lOwotCi1zdHJ1Y3QgcHRwX3NsdXJtX25vZGUgewotCWludCAJCWlkOyAgCS8qIG1vZGVsIGVsZW1lbnQgaWQsIGdlbmVyYXRlZCBieSBwcm94eSBhZ2VudCAqLwotCWludAkJCW51bWJlcjsJLyogbm9kZSBudW1iZXIsIGFzc2lnbmVkIGJ5IFNMVVJNICovCi0JY2hhciAqCQluYW1lOwotCXVpbnQxNl90CXN0YXRlOyAJLyogKHVpbnQxNl90KW5vZGVfaW5mb190LnN0YXRlLCBjb252ZXJ0ZWQgdG8gKGNoYXIgKikgICovCi0JdWludDE2X3QgCXNvY2tldHM7Ci0JdWludDE2X3QgCWNvcmVzOwotCXVpbnQxNl90IAl0aHJlYWRzOwotCWNoYXIgKgkJYXJjaDsKLQljaGFyICoJCW9zOwotfTsKLXR5cGVkZWYgc3RydWN0IHB0cF9zbHVybV9ub2RlCXB0cF9ub2RlOwotCi1zdHJ1Y3QgcHRwX3NsdXJtX3Byb2Nlc3MgewotCWludAkJaWQ7Ci0JaW50CQlub2RlX2lkOwotCWludAkJdGFza19pZDsgLyogTVBJIHJhbmsgKi8KLQlpbnQJCXBpZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBwdHBfc2x1cm1fcHJvY2VzcwlwdHBfcHJvY2VzczsKLQotc3RydWN0IHB0cF9zbHVybV9qb2IgewotCWludCAJCQkJcHRwX2pvYmlkOwkJLyogam9iIElEIGFzIGtub3duIGJ5IFBUUCAqLwotCWludCAJCQkJc2x1cm1fam9iaWQ7CS8qIGpvYiBJRCB0aGF0IHdpbGwgYmUgdXNlZCBieSBwcm9ncmFtIHdoZW4gaXQgc3RhcnRzICovCi0JYm9vbAkJCQluZWVkX2FsbG9jOwkJLyogbmVlZCB0byBhbGxvY2F0ZSBuZXcgcmVzb3VyY2UgKi8KLQlpbnQJCQkJCWRlYnVnX2pvYmlkOwotCWludAkJCQkJbnVtX3Byb2NzOwkJLyogbnVtYmVyIG9mIHByb2NzIHJlcXVlc3RlZCBmb3IgcHJvZ3JhbSAoZGVidWdnZXI6IG51bV9wcm9jcysxKSAqLwotCWludAkJCQkJc3RhdGU7CQkJLyogam9iIHN0YXRlKHNsdXJtIGRlZmluaXRpb24pICovCi0JcGlkX3QJCQkJc3J1bl9waWQ7CQkvKiBwaWQgb2YgdGhlIHNydW4gcHJvY2VzcyAqLwotCWJvb2wJCQkJZGVidWc7CQkJLyogam9iIGlzIGRlYnVnIGpvYiAqLwotCWJvb2wgCQkJCWF0dGFjaDsJCQkvKiBhdHRhY2ggZGVidWcgKi8KLQlpbnQJCQkJCWZkX2VycjsJCQkvKiBmZCBvZiBwaXBlIGZvciBzcnVuJ3Mgc3RkZXJyICovCi0JaW50CQkJCQlmZF9vdXQ7CQkJLyogZmQgb2YgcGlwZSBmb3Igc3J1bidzIHN0ZG91dCAqLwotCWludAkJCQkJaW90aHJlYWRfaWQ7CS8qIGlkIG9mIHRocmVhZCBmb3J3YXJkaW5nIHNydW4ncyBzdGRpbyAqLwotCWJvb2wJCQkJaW90aHJlYWRfZXhpdF9yZXE7IC8qIHJlcXVlc3QgaW90aHJlYWQgdG8gZXhpdCAqLwotCWJvb2wJCQkJaW90aHJlYWRfZXhpdDsgIC8qIGZsYWcgaW5pZGljYXRpb24gaW90aHJlYWQgaGFzIGV4aXRlZCAgKi8KLQlib29sCQkJCXJlbW92YWJsZTsKLQlwdHBfcHJvY2VzcyAqKiAgCXByb2NzOwkJCS8qIHByb2NzIG9mIHRoaXMgam9iICovCi0JcmFuZ2VzZXQgKiAJCQlzZXQ7CQkJLyogcmFuZ2Ugc2V0IG9mIHByb2MgSUQgKi8KLX07Ci10eXBlZGVmIHN0cnVjdCBwdHBfc2x1cm1fam9iIHB0cF9qb2I7Ci0KLXR5cGVkZWYgc3RydWN0IHNsdXJtY3RsZF9jb21tX2FkZHIgewotCWNoYXIgKiBob3N0bmFtZTsKLQl1aW50MTZfdCBwb3J0OwotfXNsdXJtY3RsZF9jb21tX2FkZHJfdDsKLQotdHlwZWRlZiB2b2lkIFNpZ0Z1bmMoaW50KTsKLXR5cGVkZWYgaW50MzJfdCBzbHVybV9mZDsKLQotCi1zdGF0aWMgaW50IFNMVVJNX0luaXRpYWxpemUoaW50LCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBTTFVSTV9Nb2RlbERlZihpbnQsIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IFNMVVJNX1N0YXJ0RXZlbnRzKGludCwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgU0xVUk1fU3RvcEV2ZW50cyhpbnQsIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IFNMVVJNX1N1Ym1pdEpvYihpbnQsIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IFNMVVJNX1Rlcm1pbmF0ZUpvYihpbnQsIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IFNMVVJNX1F1aXQoaW50LCBpbnQsIGNoYXIgKiopOwotCi1zdGF0aWMgRklMRSAqIGluaXRfbG9nZnAoKTsKLXN0YXRpYyB2b2lkIGRlYnVnX2xvZyhGSUxFICogZnAsIGNoYXIgKiBmbXQsLi4uKTsKLXN0YXRpYyB2b2lkICogc3J1bl9vdXRwdXRfZm9yd2FyZGluZyh2b2lkICogYXJnKTsKLXN0YXRpYyBib29sIGpvYl91cGRhdGVfdGltZW91dCgpOwotc3RhdGljIHZvaWQgdXBkYXRlX2pvYl9zdGF0ZShpbnQgc2x1cm1fam9iaWQpOwotc3RhdGljIGJvb2wgbm9kZV91cGRhdGVfdGltZW91dCgpOwotc3RhdGljIHZvaWQgdXBkYXRlX25vZGVfc3RhdGUoKTsKLXN0YXRpYyBpbnQgY3JlYXRlX25vZGVfbGlzdChwdHBfbWFjaGluZSAqbWFjaCk7Ci1zdGF0aWMgdm9pZCBpbml0X2pvYl90aW1lcigpOwotc3RhdGljIHZvaWQgaW5pdF9ub2RlX3RpbWVyKCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCAJCWpvYl91cGRhdGVfdGltZXI7Ci1zdGF0aWMgc3RydWN0IHRpbWV2YWwJCW5vZGVfdXBkYXRlX3RpbWVyOwotc3RhdGljIHN5bmNfbXNnICoJCQlzeW5jX21zZ19hZGRyOwotc3RhdGljIEZJTEUgKiAJCQkJbG9nZnA7Ci1zdGF0aWMgaW50IAkJCQkJZGVzdHJveV9qb2IgPSAwOyAvKiBqb2IgYWxsb2NhdGlvbiBjYW5jZWxsZWQgYnkgc2lnbmFsICovCi1zdGF0aWMgYm9vbCAJCQkJZW5hYmxlX3N0YXRlX3VwZGF0ZSA9IGZhbHNlOwotc3RhdGljIAlzcnVuX29wdF90CQkJb3B0Owotc3RhdGljIGFsbG9jYXRpb25fbXNnX3RocmVhZF90KiBtc2dfdGhyID0gTlVMTDsKLXN0YXRpYyBzbHVybWN0bGRfY29tbV9hZGRyX3Qgc2x1cm1jdGxkX2NvbW1fYWRkcjsKLXN0YXRpYyBpbnQJCQlnVHJhbnNJRCA9IDA7IC8qIHRyYW5zYWN0aW9uIGlkIGZvciBzdGFydCBvZiBldmVudCBzdHJlYW0sIGlzIDAgd2hlbiBldmVudHMgYXJlIG9mZiAqLwotc3RhdGljIGludAkJCWdCYXNlSUQgPSAtMTsgLyogYmFzZSBJRCBmb3IgZXZlbnQgZ2VuZXJhdGlvbiAqLwotc3RhdGljIGludAkJCWdMYXN0SUQgPSAxOyAgLyogSUQgZ2VuZXJhdG9yICovCi1zdGF0aWMgaW50CQkJZ1F1ZXVlSUQ7ICAgICAvKiBJRCBvZiBkZWZhdWx0IHF1ZXVlICovCi1zdGF0aWMgaW50IAkJCXByb3h5X3N0YXRlID0gU1RBVEVfSU5JVDsKLXN0YXRpYyBwcm94eV9zdnIgKglzbHVybV9wcm94eTsKLXN0YXRpYyBMaXN0ICoJCWdKb2JMaXN0Owotc3RhdGljIExpc3QgKgkJZ01hY2hpbmVMaXN0Owotc3RhdGljIGludAkJCXB0cF9zaWduYWxfZXhpdCA9IDA7OwotCi0KLXN0YXRpYyBwcm94eV9zdnJfaGVscGVyX2Z1bmNzIGhlbHBlcl9mdW5jcyA9IHsKLQlOVUxMLAkJCQkJLy8gbmV3Y29ubigpIC0gY2FuIGJlIHVzZWQgdG8gcmVqZWN0IGNvbm5lY3Rpb25zCi0JTlVMTAkJCQkJLy8gbnVtc2VydmVycygpIC0gaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNlcnZlcnMsIHJldHVybiB0aGUgbnVtYmVyCi19OwotCi0jZGVmaW5lIENNRF9CQVNFCTAKLXN0YXRpYyBwcm94eV9jbWQJY21kc1tdID0gewotCVNMVVJNX1F1aXQsCi0JU0xVUk1fSW5pdGlhbGl6ZSwKLQlTTFVSTV9Nb2RlbERlZiwKLQlTTFVSTV9TdGFydEV2ZW50cywKLQlTTFVSTV9TdG9wRXZlbnRzLAotCVNMVVJNX1N1Ym1pdEpvYiwKLQlTTFVSTV9UZXJtaW5hdGVKb2IKLX07Ci0KLXN0YXRpYyBwcm94eV9jb21tYW5kcyBjb21tYW5kX3RhYiA9IHsKLQlDTURfQkFTRSwKLQlzaXplb2YoY21kcykvc2l6ZW9mKHByb3h5X2NtZCksCi0JY21kcwotfTsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLQl7InByb3h5IiwJCQlyZXF1aXJlZF9hcmd1bWVudCwJTlVMTCwgCSdQJ30sIAotCXsicG9ydCIsCQkJcmVxdWlyZWRfYXJndW1lbnQsCU5VTEwsIAkncCd9LCAKLQl7Imhvc3QiLAkJCXJlcXVpcmVkX2FyZ3VtZW50LAlOVUxMLCAJJ2gnfSwgCi0Je05VTEwsCQkJCTAsCQkJCQlOVUxMLAkwfQotfTsKLQotCi0vKiAKLSAqIElmIHRoZSBsb2cgZmlsZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgRklMRSBwb2ludGVyLgotICogT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIHN0ZGVyci4KLSAqLwotc3RhdGljIEZJTEUgKiAKLWluaXRfbG9nZnAoKQotewotCUZJTEUgKiBmcCA9IHN0ZGVycjsKLQljaGFyICogbG9nZGlyOwotCWNoYXIgKiBsb2dmaWxlOwotCWludCAgICByYzsKLQkKLQlpZiAoKGxvZ2RpciA9IGdldGVudigiUFRQX1NMVVJNX1BST1hZX0xPR0RJUiIpKSA9PSBOVUxMKQotCQlyZXR1cm4gZnA7Ci0JCi0JcmMgPSBhY2Nlc3MobG9nZGlyLCBSX09LfFdfT0spOwotCWlmIChyYyA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJQbGVhc2UgZW5zdXJlIHRoZSBESVIgJXMgZXhpc3RzIGFuZCB5b3UgY2FuIFJFQUQvV1JJVEUgaXQhXG4iLCBsb2dkaXIpOwotCQlyZXR1cm4gZnA7Ci0JfQotCWFzcHJpbnRmKCZsb2dmaWxlLCIlcy9wdHBfcHJveHkubG9nIixsb2dkaXIpOwotCWZwID0gZm9wZW4obG9nZmlsZSwidysiKTsKLQlpZihmcCA9PSBOVUxMKSAKLQkJZnAgPSBzdGRlcnI7Ci0JZnJlZShsb2dmaWxlKTsKLQotCXJldHVybiBmcDsKLX0KLQotLyoKLSAqIFdyaXRlIGRlYnVnIGluZm8gaW50byBsb2dmaWxlLgotICovCi1zdGF0aWMgdm9pZAotZGVidWdfbG9nKEZJTEUgKiBmcCwgY2hhciAqIGZtdCwuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQotCWlmIChmcCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQl2YV9zdGFydCh2YSwgZm10KTsKLQl2ZnByaW50ZihmcCwgZm10LCB2YSk7Ci0JZmZsdXNoKGZwKTsKLQl2YV9lbmQodmEpOwotCi0JcmV0dXJuOwotfQotCi0vKgotICogR2VuZXJhdGUgYSBtb2RlbCBlbGVtZW50IElELgotICovCi1zdGF0aWMgaW50Ci1nZW5lcmF0ZV9pZCh2b2lkKQotewotCXJldHVybiBnQmFzZUlEICsgZ0xhc3RJRCsrOwotfQotCi0vKgotICogQ3JlYXRlIGEgbmV3IG1hY2hpbmUuCi0gKi8KLXN0YXRpYyBwdHBfbWFjaGluZSAqCi1uZXdfbWFjaGluZSgpCi17Ci0JcHRwX21hY2hpbmUgKgltID0gKHB0cF9tYWNoaW5lICopbWFsbG9jKHNpemVvZihwdHBfbWFjaGluZSkpOwotCW0tPmlkID0gZ2VuZXJhdGVfaWQoKTsKLQltLT5ub2RlcyA9IE5ld0xpc3QoKTsKLSAgICBBZGRUb0xpc3QoZ01hY2hpbmVMaXN0LCAodm9pZCAqKW0pOwotCi0gICAgcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IFNMVVJNIG5vZGUgc3RhdGUgY29kZSAodWludDE2X3QpIHRvIFNUUklORy4KLSAqLwotc3RhdGljIGNoYXIgKiAKLW5vZGVzdGF0ZV90b19zdHJpbmcodWludDE2X3Qgc2x1cm1fbm9kZV9zdGF0ZSkKLXsKLQljaGFyICogc3RyID0gTlVMTDsKLQotCXN3aXRjaCAoc2x1cm1fbm9kZV9zdGF0ZSAmIE5PREVfU1RBVEVfQkFTRSkgewotCQljYXNlIE5PREVfU1RBVEVfVU5LTk9XTjoKLQkJCXN0ciA9ICBTTFVSTV9OT0RFX1NUQVRFX1VOS05PV047Ci0JCQlicmVhazsKLQkJY2FzZSAgTk9ERV9TVEFURV9ET1dOOgotCQkJc3RyID0gIFNMVVJNX05PREVfU1RBVEVfRE9XTjsKLQkJCWJyZWFrOwotCQljYXNlICBOT0RFX1NUQVRFX0lETEU6Ci0JCQlzdHIgPSAgU0xVUk1fTk9ERV9TVEFURV9JRExFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTk9ERV9TVEFURV9BTExPQ0FURUQ6Ci0JCQlzdHIgPSAgU0xVUk1fTk9ERV9TVEFURV9BTExPQ0FURUQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0ciA9IFNMVVJNX05PREVfU1RBVEVfVU5LTk9XTjsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBzdHI7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IFNMVVJNIGpvYiBzdGF0ZSBjb2RlKHVpbnQxNl90KSB0byBTVFJJTkcuCi0gKi8KLXN0YXRpYyBjaGFyICoKLWpvYnN0YXRlX3RvX3N0cmluZyh1aW50MTZfdCBzbHVybV9qb2Jfc3RhdGUpCi17Ci0JY2hhciAqIHN0ciA9IE5VTEw7Ci0KLQlzd2l0Y2ggKHNsdXJtX2pvYl9zdGF0ZSAmICh+Sk9CX0NPTVBMRVRJTkcpKSB7Ci0JCWNhc2UgSk9CX1BFTkRJTkc6Ci0JCQlzdHIgPSBTTFVSTV9KT0JfU1RBVEVfUEVORElORzsgCi0JCQlicmVhazsKLQkJY2FzZSBKT0JfUlVOTklORzoKLQkJCXN0ciA9IFNMVVJNX0pPQl9TVEFURV9SVU5OSU5HOwotCQkJYnJlYWs7Ci0JCWNhc2UgSk9CX1NVU1BFTkRFRDoKLQkJCXN0ciA9IFNMVVJNX0pPQl9TVEFURV9TVVNQRU5ERUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBKT0JfQ09NUExFVEU6Ci0JCQlzdHIgPSBTTFVSTV9KT0JfU1RBVEVfQ09NUExFVEU7IAotCQkJYnJlYWs7Ci0JCWNhc2UgSk9CX0NBTkNFTExFRDoKLQkJCXN0ciA9IFNMVVJNX0pPQl9TVEFURV9DQU5DRUxMRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBKT0JfRkFJTEVEOgotCQkJc3RyID0gU0xVUk1fSk9CX1NUQVRFX0ZBSUxFRDsKLQkJCWJyZWFrOwotCQljYXNlIEpPQl9USU1FT1VUOgotCQkJc3RyID0gU0xVUk1fSk9CX1NUQVRFX1RJTUVPVVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBKT0JfTk9ERV9GQUlMOgotCQkJc3RyID0gU0xVUk1fSk9CX1NUQVRFX05PREVGQUlMOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzdHIgPSAiVW5rbm93biBqb2Igc3RhdGUiOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHN0cjsKLX0KLQotCi0vKgotICogQ3JlYXRlIGEgbmV3IG5vZGUgYW5kIGluc2VydCBpdCBpbnRvIG1hY2hpbmUgbm9kZSBsaXN0LgotICovCi1zdGF0aWMgcHRwX25vZGUgKgotbmV3X25vZGUocHRwX21hY2hpbmUgKm1hY2gsIG5vZGVfaW5mb190ICpuaSkKLXsKLQlzdGF0aWMgaW50IG5vZGVfbnVtYmVyID0gMDsKLQlwdHBfbm9kZSAqIG4gPSAocHRwX25vZGUgKiltYWxsb2Moc2l6ZW9mKHB0cF9ub2RlKSk7Ci0JCi0JbWVtc2V0KChjaGFyICopbiwgMCwgc2l6ZW9mKHB0cF9ub2RlKSk7Ci0Jbi0+aWQgPSBnZW5lcmF0ZV9pZCgpOwotCW4tPm51bWJlciA9IG5vZGVfbnVtYmVyKys7Ci0KLQluLT5zb2NrZXRzID0gbmktPnNvY2tldHM7Ci0Jbi0+Y29yZXMgPSBuaS0+Y29yZXM7Ci0Jbi0+dGhyZWFkcyA9IG5pLT50aHJlYWRzOwotCi0JaWYgKG5pLT5uYW1lICE9IE5VTEwpCi0JCW4tPm5hbWUgPSBzdHJkdXAobmktPm5hbWUpOwotCQotCW4tPnN0YXRlID0gbmktPm5vZGVfc3RhdGU7Ci0JCQotCWlmIChuaS0+YXJjaCAhPSBOVUxMKQotCQluLT5hcmNoID0gc3RyZHVwKG5pLT5hcmNoKTsKLQlpZiAobmktPm9zICE9IE5VTEwpCi0JCW4tPm9zID0gc3RyZHVwKG5pLT5vcyk7Ci0JCi0gICAgQWRkVG9MaXN0KG1hY2gtPm5vZGVzLCAodm9pZCAqKW4pOwotCi0gICAgcmV0dXJuIG47Ci19Ci0KLS8qCi0gKiBHZXQgbm9kZSBwb2ludGVyIGZyb20gbm9kZSBuYW1lLiAKLSAqLwotc3RhdGljIHB0cF9ub2RlICoKLWZpbmRfbm9kZV9ieV9uYW1lKGNoYXIgKm5hbWUpCi17Ci0JcHRwX21hY2hpbmUgKgltOwotCXB0cF9ub2RlICoJCW47Ci0JCi0JZm9yIChTZXRMaXN0KGdNYWNoaW5lTGlzdCk7IChtID0gKHB0cF9tYWNoaW5lICopR2V0TGlzdEVsZW1lbnQoZ01hY2hpbmVMaXN0KSkgIT0gTlVMTDsgKSB7Ci0JCWZvciAoU2V0TGlzdChtLT5ub2Rlcyk7IChuID0gKHB0cF9ub2RlICopR2V0TGlzdEVsZW1lbnQobS0+bm9kZXMpKSAhPSBOVUxMOyApIHsKLQkJCWlmIChzdHJjbXAobmFtZSwgbi0+bmFtZSkgPT0gMCkKLQkJCQlyZXR1cm4gbjsKLQkJfQotCX0KLQkKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBwcm9jZXNzIGFuZCBpbnNlcnQgaXQgaW50byBqb2Igc3RydWN0dXJlLgotICovCi1zdGF0aWMgcHRwX3Byb2Nlc3MgKgotbmV3X3Byb2Nlc3MocHRwX2pvYiAqam9iLCBpbnQgbm9kZV9pZCwgaW50IHRhc2tfaWQsIGludCBwaWQpCi17Ci0JcHRwX3Byb2Nlc3MgKglwID0gKHB0cF9wcm9jZXNzICopbWFsbG9jKHNpemVvZihwdHBfcHJvY2VzcykpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcC0+aWQgPSBnZW5lcmF0ZV9pZCgpOwotCXAtPnRhc2tfaWQgPSB0YXNrX2lkOwotCXAtPnBpZCA9IHBpZDsKLQlwLT5ub2RlX2lkID0gbm9kZV9pZDsKLQotICAgIGpvYi0+cHJvY3NbdGFza19pZF0gPSBwOwotICAgIGluc2VydF9pbl9yYW5nZXNldChqb2ItPnNldCwgcC0+aWQpOwotCi0gICAgcmV0dXJuIHA7Ci19Ci0KLQotLyoKLSAqIEZyZWUgdGhlIHNwYWNlIGFsbG9jYXRlZCB0byBwdHBfcHJvY2Vzcy4KLSAqLwotc3RhdGljIHZvaWQKLWZyZWVfcHJvY2VzcyhwdHBfcHJvY2VzcyAqcCkKLXsKLQlpZiAocCkKLQkJZnJlZShwKTsKLQlyZXR1cm47Ci19Ci0KLS8qCi0gKiBHZXQgcHJvY2VzcyBwb2ludGVyIGdpdmVuIGpvYiBhbmQgdGFza19pZC4KLSAqLwotc3RhdGljIHB0cF9wcm9jZXNzICoKLWZpbmRfcHJvY2VzcyhwdHBfam9iICpqb2IsIGludCB0YXNrX2lkKQotewotCWlmICh0YXNrX2lkIDwgMCB8fCB0YXNrX2lkID49IGpvYi0+bnVtX3Byb2NzKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JcmV0dXJuIGpvYi0+cHJvY3NbdGFza19pZF07Ci19Ci0JCi0vKgotICogIEdldCBqb2JpZCBvZiAnd2hpY2gnIHR5cGUKLSAqLwotc3RhdGljIGludAotZ2V0X2pvYmlkKHB0cF9qb2IgKmosIGludCB3aGljaCkKLXsKLQlpbnQgaWQgPSAtMTsKLQotCWlmIChqICE9IE5VTEwpIHsKLQkJc3dpdGNoICh3aGljaCkgewotCQljYXNlIFBUUF9KT0JJRDoKLQkJCWlkID0gai0+cHRwX2pvYmlkOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0xVUk1fSk9CSUQ6Ci0JCQlpZCA9IGotPnNsdXJtX2pvYmlkOwotCQkJYnJlYWs7Ci0JCWNhc2UgREVCVUdfSk9CSUQ6Ci0JCQlpZCA9IGotPmRlYnVnX2pvYmlkOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZCA9IC0xOwotCQkJYnJlYWs7Ci0JCX0JCi0JfQotCi0JcmV0dXJuIGlkOwotfQotCi0vKgotICogQ3JlYXRlIGEgbmV3IGpvYixzZXQgam9iIGF0dHJpYnV0ZXMgYW5kIGFkZCB0byBnSm9iTGlzdC4gIAotICovCi1zdGF0aWMgcHRwX2pvYiAqCi1uZXdfam9iKGludCBudW1fcHJvY3MsIGJvb2wgZGVidWcsIGludCBwdHBfam9iaWQsIGludCBzbHVybV9qb2JpZCwgaW50IGRlYnVnX2pvYmlkLCBib29sIG5lZWRfYWxsb2MpCi17Ci0JcHRwX2pvYiAqCWogPSAocHRwX2pvYiAqKW1hbGxvYyhzaXplb2YocHRwX2pvYikpOwotCWlmIChqID09IE5VTEwpIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCAiQWxsY29hdGUgc3BhY2UgZm9yIGpvYiBzdHJ1Y3QgZmFpbC4gXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQkKLQotCWotPnB0cF9qb2JpZCA9IHB0cF9qb2JpZDsKLSAgICBqLT5zbHVybV9qb2JpZCA9IHNsdXJtX2pvYmlkOwotCWotPm5lZWRfYWxsb2MgPSBuZWVkX2FsbG9jOyAKLSAgICBqLT5udW1fcHJvY3MgPSBudW1fcHJvY3M7Ci0gICAgai0+ZGVidWcgPSBkZWJ1ZzsKLQlqLT5kZWJ1Z19qb2JpZCA9IGRlYnVnX2pvYmlkOwotCWotPmF0dGFjaCA9IGZhbHNlOwotCWotPnNydW5fcGlkID0gLTE7Ci0Jai0+c3RhdGUgPSAtMTsKLQlqLT5yZW1vdmFibGUgPSBmYWxzZTsKLQlqLT5mZF9lcnIgPSAtMTsKLQlqLT5mZF9vdXQgPSAtMTsKLQlqLT5pb3RocmVhZF9pZCA9IC0xOwotCWotPmlvdGhyZWFkX2V4aXRfcmVxID0gZmFsc2U7Ci0Jai0+aW90aHJlYWRfZXhpdCA9IGZhbHNlOwotCWotPnNldCA9IG5ld19yYW5nZXNldCgpOwotCWotPnByb2NzID0gKHB0cF9wcm9jZXNzICoqKW1hbGxvYyhzaXplb2YocHRwX3Byb2Nlc3MgKikgKiBudW1fcHJvY3MpOwotCW1lbXNldChqLT5wcm9jcywgMCwgc2l6ZW9mKHB0cF9wcm9jZXNzICopICogbnVtX3Byb2NzKTsKLQotICAgIEFkZFRvTGlzdChnSm9iTGlzdCwgKHZvaWQgKilqKTsKLQotICAgIHJldHVybiBqOwotfQotCi0vKgotICogRnJlZSBqb2Igc3BhY2UgYWxsb2NhdGVkIGJ5IG5ld19qb2IoKS4KLSAqLwotc3RhdGljIHZvaWQKLWZyZWVfam9iKHB0cF9qb2IgKmopCi17Ci0JaW50IGk7Ci0KLQlpZiAoaikgewotCQlpZiAoai0+cHJvY3MpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBqLT5udW1fcHJvY3M7IGkrKykgewotCQkJCWlmIChqLT5wcm9jc1tpXSAhPSBOVUxMKSAKLQkJCQkJZnJlZV9wcm9jZXNzKGotPnByb2NzW2ldKTsKLQkJCX0KLQkJCWZyZWUoai0+cHJvY3MpOwotCQl9Ci0JCWlmIChqLT5zZXQpIAotCQkJZnJlZV9yYW5nZXNldChqLT5zZXQpOwotCi0JCWZyZWUoaik7Ci0JfQkKLX0KLQotCi0vKgotICogR2V0IGpvYiBwb2ludGVyIGdpdmVuIHRoZSBqb2JpZCBvZiAnd2hpY2gnIHR5cGUuCi0gKiBJZiBkZWJ1ZyBpcyB0cnVlLCBmaW5kIHRoZSBqb2IgdXNpbmcgdGhlIGRlYnVnIGpvYmlkLgotICovCi1zdGF0aWMgcHRwX2pvYiAqCi1maW5kX2pvYihpbnQgam9iaWQsIGludCB3aGljaCkKLXsKLQlwdHBfam9iICoJaiA9IE5VTEw7Ci0JCi0JZm9yIChTZXRMaXN0KGdKb2JMaXN0KTsgKGogPSAocHRwX2pvYiAqKUdldExpc3RFbGVtZW50KGdKb2JMaXN0KSkgIT0gTlVMTDsgKSB7Ci0JCWlmIChnZXRfam9iaWQoaiwgd2hpY2gpID09IGpvYmlkKSAKLQkJCXJldHVybiBqOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIERldGVybWluIGlmIHRoZSBnaXZlbiBqb2IgaXMgQUNUSVZFLgotICovCi1zdGF0aWMgYm9vbCAKLXNsdXJtX2pvYl9hY3RpdmUocHRwX2pvYiAqIGpvYikKLXsKLQl1aW50MTZfdCBzdGF0ZTsKLQlib29sIAlhY3RpdmU7Ci0JCi0Jc3RhdGUgPSBqb2ItPnN0YXRlOwotCWlmIChzdGF0ZSA9PSBKT0JfQ09NUExFVEUgfHwgc3RhdGUgPT0gSk9CX0NBTkNFTExFRCAKLQkJfHwgc3RhdGUgPT0gSk9CX0ZBSUxFRCB8fCBzdGF0ZSA9PSBKT0JfVElNRU9VVCB8fCBzdGF0ZSA9PSBKT0JfTk9ERV9GQUlMKSB7Ci0JCWFjdGl2ZSA9IGZhbHNlOwotCX0gZWxzZQotCQlhY3RpdmUgPSB0cnVlOyAgLyogSk9CX0NPTVBMRVRJTkcgaXMgQUNUSVZFICovCi0KLQlyZXR1cm4gYWN0aXZlOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE9LRXZlbnQoaW50IHRyYW5zX2lkKQotewotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIHByb3h5X29rX2V2ZW50KHRyYW5zX2lkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kU2h1dGRvd25FdmVudChpbnQgdHJhbnNfaWQpCi17Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgcHJveHlfc2h1dGRvd25fZXZlbnQodHJhbnNfaWQpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRNZXNzYWdlRXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICpsZXZlbCwgaW50IGNvZGUsIGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QJCWFwOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgcHJveHlfbWVzc2FnZV9ldmVudCh0cmFuc19pZCwgbGV2ZWwsIGNvZGUsIGZtdCwgYXApKTsKLQl2YV9lbmQoYXApOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZEVycm9yRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgY29kZSwgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdAkJYXA7Ci0KLQl2YV9zdGFydChhcCwgZm10KTsKLQlkZWJ1Z19sb2cobG9nZnAsICJzZW5kRXJyb3JFdmVudCglZCwlZCksIiwgdHJhbnNfaWQsIGNvZGUpOwotCWRlYnVnX2xvZyhsb2dmcCwgZm10LGFwKTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBwcm94eV9lcnJvcl9ldmVudCh0cmFuc19pZCwgY29kZSwgZm10LCBhcCkpOwotCXZhX2VuZChhcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kSm9iU3ViRXJyb3JFdmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmpvYlN1YklkLCBjaGFyICptc2cpCi17Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgcHJveHlfc3VibWl0am9iX2Vycm9yX2V2ZW50KHRyYW5zX2lkLCBqb2JTdWJJZCwgUlRFVl9FUlJPUl9TTFVSTV9TVUJNSVQsIG1zZykpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZW5kSm9iVGVybWluYXRlRXJyb3JFdmVudChpbnQgdHJhbnNfaWQsIGludCBpZCwgY2hhciAqbXNnKQotewotCWNoYXIgKglqb2JfaWQ7Ci0JCi0JYXNwcmludGYoJmpvYl9pZCwgIiVkIiwgaWQpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIHByb3h5X3Rlcm1pbmF0ZWpvYl9lcnJvcl9ldmVudCh0cmFuc19pZCwgam9iX2lkLCBSVEVWX0VSUk9SX0pPQiwgbXNnKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTmV3TWFjaGluZUV2ZW50KGludCB0cmFuc19pZCwgaW50IGlkLCBjaGFyICpuYW1lKQotewotCWNoYXIgKglybV9pZDsKLQljaGFyICoJbWFjaGluZV9pZDsKLQkKLQlhc3ByaW50Zigmcm1faWQsICIlZCIsIGdCYXNlSUQpOwkKLQlhc3ByaW50ZigmbWFjaGluZV9pZCwgIiVkIiwgaWQpOwkKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBwcm94eV9uZXdfbWFjaGluZV9ldmVudCh0cmFuc19pZCwgcm1faWQsIG1hY2hpbmVfaWQsIG5hbWUsIE1BQ0hJTkVfU1RBVEVfVVApKTsKLQlmcmVlKG1hY2hpbmVfaWQpOwotCWZyZWUocm1faWQpOwotfQotCi0KLS8qCi0gKiBHZXQgdGhlIG51bWJlciBvZiBub2RlIGF0dHJpYnV0ZXMgc2V0dXAgaW4gcHRwX25vZGUuCi0gKi8KLXN0YXRpYyBpbnQKLW51bV9ub2RlX2F0dHJzKHB0cF9ub2RlICpub2RlKQotewotCWludAljbnQgPSAwOwotCi0JaWYgKG5vZGUtPm51bWJlciA+PSAwKQotCQljbnQrKzsKLQlpZiAobm9kZS0+c29ja2V0cyA+IDApCi0JCWNudCsrOwotCWlmIChub2RlLT5jb3JlcyA+IDApCi0JCWNudCsrOwotCWlmIChub2RlLT50aHJlYWRzID4gMCkKLQkJY250Kys7Ci0JaWYgKG5vZGUtPmFyY2ggIT0gTlVMTCkKLQkJY250Kys7Ci0JaWYgKG5vZGUtPm9zICE9IE5VTEwpCi0JCWNudCsrOwotCi0JcmV0dXJuIGNudDsJCi19Ci0KLS8qCi0gKiBBZGQgbm9kZSBhdHRyaWJ1dGVzIHRvIHByb3h5X21zZy4gCi0gKi8KLXN0YXRpYyB2b2lkCi1hZGRfbm9kZV9hdHRycyhwcm94eV9tc2cgKm0sIHB0cF9ub2RlICpub2RlKQotewotCQotICAgIC8qIE5PREVfTlVNQkVSX0FUVFIgZW5hYmxlcyB0aGUgbm9kZSBudW1iZXIgcnVsZXIgaW4gTWFjaGluZSBWaWV3ICovCi0JaWYgKG5vZGUtPm51bWJlciA+PSAwKQotCQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtLCBTTFVSTV9OT0RFX05VTUJFUl9BVFRSLCBub2RlLT5udW1iZXIpOwotCi0JcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobSwgU0xVUk1fTk9ERV9TT0NLRVRTX0FUVFIsIChpbnQpbm9kZS0+c29ja2V0cyk7Ci0JcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobSwgU0xVUk1fTk9ERV9DT1JFU19BVFRSLCAoaW50KW5vZGUtPmNvcmVzKTsKLQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtLCBTTFVSTV9OT0RFX1RIUkVBRFNfQVRUUiwgKGludClub2RlLT50aHJlYWRzKTsKLQotCWlmIChub2RlLT5hcmNoICE9IE5VTEwpCi0JCXByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG0sIFNMVVJNX05PREVfQVJDSF9BVFRSLCBub2RlLT5hcmNoKTsKLQlpZiAobm9kZS0+b3MgIT0gTlVMTCkKLQkJcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUobSwgU0xVUk1fTk9ERV9PU19BVFRSLCBub2RlLT5vcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTmV3Sm9iRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgam9iaWQsIGNoYXIgKm5hbWUsIGNoYXIgKmpvYlN1YklkLCBjaGFyICpzdGF0ZSkKLXsKLQljaGFyICoJcXVldWVfaWQ7Ci0JY2hhciAqCWpvYl9pZDsKLQkKLQlhc3ByaW50ZigmcXVldWVfaWQsICIlZCIsIGdRdWV1ZUlEKTsJCi0JYXNwcmludGYoJmpvYl9pZCwgIiVkIiwgam9iaWQpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIHByb3h5X25ld19qb2JfZXZlbnQodHJhbnNfaWQsIHF1ZXVlX2lkLCBqb2JfaWQsIG5hbWUsIHN0YXRlLCBqb2JTdWJJZCkpOwotCWZyZWUocXVldWVfaWQpOwotCWZyZWUoam9iX2lkKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmROZXdOb2RlRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgbWFjaGlkLCBwdHBfbWFjaGluZSAqbWFjaCkKLXsKLQlwdHBfbm9kZSAqCW47Ci0JcHJveHlfbXNnICoJbTsKLQljaGFyICoJCW1hY2hpbmVfaWQ7Ci0JY2hhciAqCQlub2RlX2lkOwotCQotCWFzcHJpbnRmKCZtYWNoaW5lX2lkLCAiJWQiLCBtYWNoaWQpOwotCW0gPSBwcm94eV9uZXdfbm9kZV9ldmVudCh0cmFuc19pZCwgbWFjaGluZV9pZCwgU2l6ZU9mTGlzdChtYWNoLT5ub2RlcykpOwotCWZvciAoU2V0TGlzdChtYWNoLT5ub2Rlcyk7IChuID0gKHB0cF9ub2RlICopR2V0TGlzdEVsZW1lbnQobWFjaC0+bm9kZXMpKSAhPSBOVUxMOyApIHsKLQkJYXNwcmludGYoJm5vZGVfaWQsICIlZCIsIG4tPmlkKTsKLQkJcHJveHlfYWRkX25vZGUobSwgbm9kZV9pZCwgbi0+bmFtZSwgbm9kZXN0YXRlX3RvX3N0cmluZyhuLT5zdGF0ZSksIG51bV9ub2RlX2F0dHJzKG4pKTsKLQkJYWRkX25vZGVfYXR0cnMobSwgbik7Ci0JCWZyZWUobm9kZV9pZCk7Ci0JfQotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIG0pOwotCWZyZWUobWFjaGluZV9pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTm9kZUNoYW5nZUV2ZW50KGludCB0cmFuc19pZCwgY2hhciAqIGlkX3JhbmdlLCBjaGFyICogc3RhdGUpCi17Ci0JcHJveHlfbXNnICogbTsKLQotCW0gPSBwcm94eV9ub2RlX2NoYW5nZV9ldmVudCh0cmFuc19pZCwgaWRfcmFuZ2UsIDEpOwotCXByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG0sIE5PREVfU1RBVEVfQVRUUiwgc3RhdGUpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIG0pOwotfQotCi0vKgotICogRklYTUU6IAotICoJQWRkIGV4dHJhIGF0dHJpYnV0ZXMgd2hlbiB0YXNrIHRvcG9sb2d5IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KLSAqICBUaGlzIGNhbiBiZSBkb25lIHZpYSBzbHVybV9qb2Jfc3RlcF9sYXlvdXRfZ2V0KCkgQVBJIHdoZW4gdXBkYXRpbmcgam9iIHN0YXRlLgotICovCi1zdGF0aWMgdm9pZAotc2VuZE5ld1Byb2Nlc3NFdmVudChpbnQgdHJhbnNfaWQsIGludCBqb2JpZCwgcHRwX3Byb2Nlc3MgKnAsIGNoYXIgKnN0YXRlKQotewotCXByb3h5X21zZyAqCW07Ci0JY2hhciAqCQlqb2JfaWQ7Ci0JY2hhciAqCQlwcm9jX2lkOwotCWNoYXIgKgkJbmFtZTsKLQkKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JCi0JYXNwcmludGYoJmpvYl9pZCwgIiVkIiwgam9iaWQpOwotCWFzcHJpbnRmKCZwcm9jX2lkLCAiJWQiLCBwLT5pZCk7Ci0JYXNwcmludGYoJm5hbWUsICIlZCIsICBwLT50YXNrX2lkKTsKLQkKLQltID0gcHJveHlfbmV3X3Byb2Nlc3NfZXZlbnQodHJhbnNfaWQsIGpvYl9pZCwgMSk7Ci0JLyoKLQkgKiBCeSBub3csIHAtPm5vZGVfaWQsIHAtPnRhc2tfaWQsIHAtPnBpZCBjYW4ndCBiZSBvYnRhaW5lZC4KLQkgKiBTbyBzZXQgdGhlIGV4dHJhX2F0dHJzPTAKLQkgKi8KLQlwcm94eV9hZGRfcHJvY2VzcyhtLCBwcm9jX2lkLCBuYW1lLCBzdGF0ZSwgMCk7Ci0JLyoJCi0JcHJveHlfYWRkX3Byb2Nlc3MobSwgcHJvY19pZCwgbmFtZSwgc3RhdGUsIDMpOwotCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG0sIFBST0NfTk9ERUlEX0FUVFIsIHAtPm5vZGVfaWQpOwkKLQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtLCBQUk9DX0lOREVYX0FUVFIsIHAtPnRhc2tfaWQpOwkKLQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtLCBQUk9DX1BJRF9BVFRSLCBwLT5waWQpOwotCSovCi0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgbSk7Ci0JCi0JZnJlZShqb2JfaWQpOwotCWZyZWUocHJvY19pZCk7Ci0JZnJlZShuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmROZXdRdWV1ZUV2ZW50KGludCB0cmFuc19pZCkKLXsKLQljaGFyICoJCXJtX2lkOwotCWNoYXIgKgkJcXVldWVfaWQ7Ci0JCi0JZ1F1ZXVlSUQgPSBnZW5lcmF0ZV9pZCgpOwotCQotCWFzcHJpbnRmKCZybV9pZCwgIiVkIiwgZ0Jhc2VJRCk7Ci0JYXNwcmludGYoJnF1ZXVlX2lkLCAiJWQiLCBnUXVldWVJRCk7Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgcHJveHlfbmV3X3F1ZXVlX2V2ZW50KHRyYW5zX2lkLCBybV9pZCwgcXVldWVfaWQsIERFRkFVTFRfUVVFVUVfTkFNRSwgUVVFVUVfU1RBVEVfTk9STUFMKSk7Ci0JCi0JZnJlZShybV9pZCk7Ci0JZnJlZShxdWV1ZV9pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kUHJvY2Vzc1N0YXRlQ2hhbmdlRXZlbnQoaW50IHRyYW5zX2lkLCBwdHBfam9iICpqLCBjaGFyICpzdGF0ZSkKLXsKLQlwcm94eV9tc2cgKgltOwotCQotCWlmIChqID09IE5VTEwgfHwgai0+bnVtX3Byb2NzID09IDApCi0JCXJldHVybjsKLQkJCi0JbSA9IHByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCByYW5nZXNldF90b19zdHJpbmcoai0+c2V0KSwgMSk7Ci0JcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUobSwgUFJPQ19TVEFURV9BVFRSLCBzdGF0ZSk7Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgbSk7Ci19Ci0JCi0JCi1zdGF0aWMgdm9pZAotc2VuZEpvYlN0YXRlQ2hhbmdlRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgam9iaWQsIGNoYXIgKnN0YXRlKQotewotCWNoYXIgKgkJam9iX2lkOwotCXByb3h5X21zZyAqCW07Ci0JCi0JYXNwcmludGYoJmpvYl9pZCwgIiVkIiwgam9iaWQpOwotCi0JbSA9IHByb3h5X2pvYl9jaGFuZ2VfZXZlbnQodHJhbnNfaWQsIGpvYl9pZCwgMSk7Ci0JcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUobSwgSk9CX1NUQVRFX0FUVFIsIHN0YXRlKTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBtKTsKLQkKLQlmcmVlKGpvYl9pZCk7Ci19Ci0KLS8qCi0gKiBTTFVSTSBwcm92aWRlcyBubyBwcm9jZXNzIHN0YXRlLCBvbmx5IGpvYiBzdGF0ZS4KLSAqIExldCBwcm9jZXNzIHN0YXRlIGVxdWFsIHRvIGpvYiBzdGF0ZS4KLSAqLwotc3RhdGljIHZvaWQKLXNlbmRQcm9jZXNzQ2hhbmdlRXZlbnQoaW50IHRyYW5zX2lkLCBwdHBfcHJvY2VzcyAqcCwgaW50IG5vZGVfaWQsIGludCB0YXNrX2lkLCBpbnQgcGlkKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRQcm9jZXNzT3V0cHV0RXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgcHJvY2lkLCBjaGFyICpvdXRwdXQpCi17Ci0JY2hhciAqCQlwcm9jX2lkOwotCXByb3h5X21zZyAqCW07Ci0JCi0JYXNwcmludGYoJnByb2NfaWQsICIlZCIsIHByb2NpZCk7Ci0JCi0JbSA9IHByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCBwcm9jX2lkLCAxKTsKLQlwcm94eV9hZGRfc3RyaW5nX2F0dHJpYnV0ZShtLCBQUk9DX1NURE9VVF9BVFRSLCBvdXRwdXQpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIG0pOwotCQotCWZyZWUocHJvY19pZCk7CQotfQotCi0vKgotICogR2V0IHRoZSBudW1iZXIgb2YgY29tcHV0ZSBub2RlcyBtYW5hZ2VkIGJ5IFNMVVJNLgotICovCi1zdGF0aWMgaW50Ci1nZXRfbnVtX25vZGVzKGludCBtYWNoaWQpCi17Ci0JdWludDMyX3QgY250ID0gMDsKLQlub2RlX2luZm9fbXNnX3QgKiBuaW5mbzsKLQotCXNsdXJtX2xvYWRfbm9kZSgodGltZV90KU5VTEwsICZuaW5mbywgU0hPV19BTEwpOwotCWNudCA9IG5pbmZvLT5yZWNvcmRfY291bnQ7Ci0Jc2x1cm1fZnJlZV9ub2RlX2luZm9fbXNnKG5pbmZvKTsKLQkKLQlyZXR1cm4gY250OwotfQotCi0vKiAKLSAqIEN1cnJlbnRseSBvbmx5IE9ORSBtYWNoaW5lIHN1cHBvcnRlZC4KLSAqLwotc3RhdGljIGludCAKLWdldF9udW1fbWFjaGluZXMoKQotewotCXJldHVybiAxOwotfQotCi0vKgotICogR2V0IGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXIgbm9kZSB3aGVyZSBzbHVybWN0bGQgcnVucy4KLSAqLwotc3RhdGljIGNoYXIgKgotZ2V0X21hY2hpbmVfbmFtZShpbnQgbnVtKQotewotCXN0YXRpYyBjaGFyCWhvc3RuYW1lWzUxMl07Ci0JCi0JZ2V0aG9zdG5hbWUoaG9zdG5hbWUsIDUxMik7Ci0JcmV0dXJuIGhvc3RuYW1lOwotfQotCi0vKgotICogQ3RlYXRlIHRoZSBub2RlIGxpc3QgZm9yIGEgbWFjaGluZS4KLSAqLwotc3RhdGljIGludAotY3JlYXRlX25vZGVfbGlzdChwdHBfbWFjaGluZSAqbWFjaCkKLXsKLQl1aW50MzJfdCBjbnQ7Ci0Jbm9kZV9pbmZvX21zZ190ICpubXNnOwotCXB0cF9ub2RlICoJCW5vZGU7Ci0JaW50IGk7Ci0KLQlpZiAoc2x1cm1fbG9hZF9ub2RlKCh0aW1lX3QpTlVMTCwmbm1zZywgU0hPV19BTEwpKQotCQlyZXR1cm4gLTE7Ci0KLQljbnQgPSBubXNnLT5yZWNvcmRfY291bnQ7Ci0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSAKLQkJbm9kZSA9IG5ld19ub2RlKG1hY2gsIG5tc2ctPm5vZGVfYXJyYXkgKyBpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogSWYgd2UncmUgdW5kZXIgZGVidWcgY29udHJvbCwgbGV0IHRoZSBkZWJ1Z2dlciBoYW5kbGUgcHJvY2VzcyBzdGF0ZSB1cGRhdGUuIAotICogCi0gKiBOb3RlOiB0aGlzIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIGRlYnVnZ2VyIGFsbG93cyB0aGUgcHJvZ3JhbSB0bwotICogcmVhY2ggTVBJX0luaXQoKSwgd2hpY2ggbWF5IG5ldmVyIGhhcHBlbiAoZS5nLiBpZiBpdCdzIG5vdCBhbiBNUEkgcHJvZ3JhbSkuIAotICogRG9uJ3QgcmVseSB0aGlzIHRvIGRvIGFueXRoaW5nIGZvciBhcmJpdHJhcnkgam9icy4KLSAqIAotICogTm90ZSBhbHNvOiB0aGUgZGVidWdnZXIgbWFuYWdlcyBwcm9jZXNzIHN0YXRlIHVwZGF0ZXMgc28gd2UgZG9uJ3QgbmVlZAotICogdG8gc2VuZCBldmVudHMgYmFjayB0byB0aGUgcnVudGltZS4KLSAqLwotCi0gCi0vL3N0YXRpYyB2b2lkCi0vL2RlYnVnX2FwcF9qb2Jfc3RhdGVfY2FsbGJhY2sob3J0ZV9qb2JpZF90IGpvYmlkLCBvcnRlX3Byb2Nfc3RhdGVfdCBzdGF0ZSkKLS8vewotCS8qIHRoaXMgaXMgd2hhdCBpdCBoYXMgYmVmb3JlLCB1bnRvdWNoZWQgKi8KLS8vCXN3aXRjaChzdGF0ZSkgewotLy8JCWNhc2UgT1JURV9QUk9DX1NUQVRFX1RFUk1JTkFURUQ6Ci0vLwkJY2FzZSBPUlRFX1BST0NfU1RBVEVfQUJPUlRFRDoKLS8vCQkJYnJlYWs7Ci0vLwl9Ci0vL30KLQotLyoKLSAqIGpvYl9zdGF0ZV9jYWxsYmFjayBmb3IgdGhlIGRlYnVnZ2VyLiBEZXRlY3RzIGRlYnVnZ2VyIHN0YXJ0IGFuZCBleGl0IGFuZCBub3RpZmllcyB0aGUKLSAqIFVJLiBDbGVhbnMgdXAgam9iIGlkIG1hcC4KLSAqLwotLyogCi1zdGF0aWMgdm9pZAotZGVidWdfam9iX3N0YXRlX2NhbGxiYWNrKG9ydGVfam9iaWRfdCBqb2JpZCwgb3J0ZV9wcm9jX3N0YXRlX3Qgc3RhdGUpCi17Ci0JcHRwX2pvYgkqCQlqOwotCQotCWlmICgoaiA9IGZpbmRfam9iKGpvYmlkLCBKT0JJRF9ERUJVRykpID09IE5VTEwpCi0JCXJldHVybjsKLQkKLQlkb19zdGF0ZV9jYWxsYmFjayhqLCBzdGF0ZSk7Ci19Ci0qLwotCi0vKiAKLSAqIFRlbGwgdGhlIGRhZW1vbiB0byBleGl0LiAKLSAqIE5vb3BzIGZvciBTTFVSTS4KLSAqLwotc3RhdGljIGludAotZG9fc2x1cm1fc2h1dGRvd24odm9pZCkKLXsKLQlkZWJ1Z19sb2cobG9nZnAsICJkb19zbHVybV9zaHV0ZG93bigpIGNhbGxlZC5cbiIpOyAKLQlyZXR1cm4gMDsKLX0KLQotLyogCi0gKiBnZXRob3N0bmFtZV9zaG9ydCAtIGVxdWl2YWxlbnQgdG8gZ2V0aG9zdG5hbWUsIGJ1dCByZXR1cm4gb25seSB0aGUgZmlyc3QKLSAqIGNvbXBvbmVudCBvZiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgCi0gKiAoZS5nLiAibGludXgxMjMuZm9vLmJhciIgYmVjb21lcyAibGludXgxMjMiKSAKLSAqLwotc3RhdGljIGludAotZ2V0aG9zdG5hbWVfc2hvcnQgKGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCi17Ci0JaW50IGVycm9yX2NvZGUsIG5hbWVfbGVuOwotCWNoYXIgKmRvdF9wdHIsIHBhdGhfbmFtZVsxMDI0XTsKLQotCWVycm9yX2NvZGUgPSBnZXRob3N0bmFtZSAocGF0aF9uYW1lLCBzaXplb2YocGF0aF9uYW1lKSk7Ci0JaWYgKGVycm9yX2NvZGUpCi0JCXJldHVybiBlcnJvcl9jb2RlOwotCi0JZG90X3B0ciA9IHN0cmNociAocGF0aF9uYW1lLCAnLicpOwotCWlmIChkb3RfcHRyID09IE5VTEwpCi0JCWRvdF9wdHIgPSBwYXRoX25hbWUgKyBzdHJsZW4ocGF0aF9uYW1lKTsKLQllbHNlCi0JCWRvdF9wdHJbMF0gPSAnXDAnOwotCi0JbmFtZV9sZW4gPSBkb3RfcHRyIC0gcGF0aF9uYW1lOwotCWlmIChuYW1lX2xlbiA+IGxlbikKLQkJcmV0dXJuIEVOQU1FVE9PTE9ORzsKLQotCXN0cmNweSAobmFtZSwgcGF0aF9uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogU2V0IGRlZmF1bHQgc3J1biBvcHRpb25zLgotICovCi1zdGF0aWMgaW50IAotb3B0X2RlZmF1bHQoc3J1bl9vcHRfdCAqIG9wdCkKLXsKLQljaGFyIGJ1ZltNQVhQQVRITEVOICsgMV07Ci0Jc3RydWN0IHBhc3N3ZCAqcHc7Ci0JaW50IGk7Ci0JY2hhciBob3N0bmFtZVs2NF07Ci0JCi0JaWYgKG9wdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoKHB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpKSAhPSBOVUxMKSB7Ci0JCXN0cm5jcHkob3B0LT5wc191c2VyLCBwdy0+cHdfbmFtZSwgTUFYX1VTRVJOQU1FKTsKLQkJb3B0LT5wc191aWQgPSBwdy0+cHdfdWlkOwotCX0gZWxzZSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgIm9wdF9kZWZhdWx0OndobyBhcmUgeW91PyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jb3B0LT5wc19naWQgPSBnZXRnaWQoKTsKLQotCWlmICgoZ2V0Y3dkKGJ1ZiwgTUFYUEFUSExFTikpID09IE5VTEwpIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCJnZXRjd2QgZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jb3B0LT5wc19jd2QgPSBzdHJkdXAoYnVmKTsgCi0Jb3B0LT5wc19jd2Rfc2V0ID0gZmFsc2U7Ci0Jb3B0LT5wc19wcm9nbmFtZSA9IE5VTEw7Ci0Jb3B0LT5wc19ucHJvY3MgPSAxOwotCW9wdC0+cHNfbnByb2NzX3NldCA9IGZhbHNlOwotCW9wdC0+cHNfY3B1c19wZXJfdGFzayA9IDE7IAotCW9wdC0+cHNfY3B1c19zZXQgPSBmYWxzZTsKLQlvcHQtPnBzX21pbl9ub2RlcyA9IDE7Ci0Jb3B0LT5wc19tYXhfbm9kZXMgPSAwOwotCW9wdC0+cHNfbWluX3NvY2tldHNfcGVyX25vZGUgPSBOT19WQUw7IC8qIHJlcXVlc3RlZCBtaW4vbWF4c29ja2V0cyAqLwotCW9wdC0+cHNfbWF4X3NvY2tldHNfcGVyX25vZGUgPSBOT19WQUw7Ci0Jb3B0LT5wc19taW5fY29yZXNfcGVyX3NvY2tldCA9IE5PX1ZBTDsgLyogcmVxdWVzdGVkIG1pbi9tYXhjb3JlcyAqLwotCW9wdC0+cHNfbWF4X2NvcmVzX3Blcl9zb2NrZXQgPSBOT19WQUw7Ci0Jb3B0LT5wc19taW5fdGhyZWFkc19wZXJfY29yZSA9IE5PX1ZBTDsgLyogcmVxdWVzdGVkIG1pbi9tYXh0aHJlYWRzICovCi0Jb3B0LT5wc19tYXhfdGhyZWFkc19wZXJfY29yZSA9IE5PX1ZBTDsgCi0Jb3B0LT5wc19udGFza3NfcGVyX25vZGUgICAgICA9IE5PX1ZBTDsgLyogbnRhc2sgbWF4IGxpbWl0cyAqLwotCW9wdC0+cHNfbnRhc2tzX3Blcl9zb2NrZXQgICAgPSBOT19WQUw7IAotCW9wdC0+cHNfbnRhc2tzX3Blcl9jb3JlICAgICAgPSBOT19WQUw7IAotCW9wdC0+cHNfbm9kZXNfc2V0ID0gZmFsc2U7Ci0Jb3B0LT5wc19jcHVfYmluZF90eXBlID0gMDsKLQlvcHQtPnBzX2NwdV9iaW5kID0gTlVMTDsKLQlvcHQtPnBzX21lbV9iaW5kX3R5cGUgPSAwOwotCW9wdC0+cHNfbWVtX2JpbmQgPSBOVUxMOwotCW9wdC0+cHNfdGltZV9saW1pdCA9IE5PX1ZBTDsKLQlvcHQtPnBzX3RpbWVfbGltaXRfc3RyID0gTlVMTDsKLQlvcHQtPnBzX2NrcHRfaW50ZXJ2YWwgPSAwOwotCW9wdC0+cHNfY2twdF9pbnRlcnZhbF9zdHIgPSBOVUxMOwotCW9wdC0+cHNfY2twdF9wYXRoID0gTlVMTDsKLQlvcHQtPnBzX3BhcnRpdGlvbiA9IE5VTEw7Ci0JCi0JLy91c2UgZGVmYXVsdCB2YWx1ZTozMgotCS8qIAotCW9wdC0+cHNfbWF4X3RocmVhZHMgPSBNQVhfVEhSRUFEUzsKLQlwbWlfc2VydmVyX21heF90aHJlYWRzKG9wdC0+cHNfbWF4X3RocmVhZHMpOwotCSovCi0KLQlvcHQtPnBzX3JlbGF0aXZlID0gTk9fVkFMOwotCW9wdC0+cHNfcmVsYXRpdmVfc2V0ID0gZmFsc2U7Ci0Jb3B0LT5wc19qb2JfbmFtZSA9IE5VTEw7Ci0Jb3B0LT5wc19qb2JfbmFtZV9zZXQgPSBmYWxzZTsKLQlvcHQtPnBzX2pvYmlkID0gTk9fVkFMOwotCW9wdC0+cHNfam9iaWRfc2V0ID0gZmFsc2U7Ci0Jb3B0LT5wc19kZXBlbmRlbmN5ID0gTlVMTDsKLQlvcHQtPnBzX2FjY291bnQgID0gTlVMTDsKLQlvcHQtPnBzX2NvbW1lbnQgID0gTlVMTDsKLQotCW9wdC0+cHNfZGlzdHJpYnV0aW9uID0gU0xVUk1fRElTVF9VTktOT1dOOwotCW9wdC0+cHNfcGxhbmVfc2l6ZSAgID0gTk9fVkFMOwotCi0Jb3B0LT5wc19vZm5hbWUgPSBOVUxMOwotCW9wdC0+cHNfaWZuYW1lID0gTlVMTDsKLQlvcHQtPnBzX2VmbmFtZSA9IE5VTEw7Ci0KLQlvcHQtPnBzX2NvcmVfdHlwZSA9IENPUkVfREVGQVVMVDsKLQotCW9wdC0+cHNfbGFiZWxpbyA9IGZhbHNlOwotCW9wdC0+cHNfdW5idWZmZXJlZCA9IGZhbHNlOwotCW9wdC0+cHNfb3ZlcmNvbW1pdCA9IGZhbHNlOwotCW9wdC0+cHNfc2hhcmVkID0gKHVpbnQxNl90KU5PX1ZBTDsKLQlvcHQtPnBzX2V4Y2x1c2l2ZSA9IGZhbHNlOwotCW9wdC0+cHNfbm9fa2lsbCA9IGZhbHNlOwotCW9wdC0+cHNfa2lsbF9iYWRfZXhpdCA9IGZhbHNlOwotCi0Jb3B0LT5wc19pbW1lZGlhdGUgPSBmYWxzZTsKLQotCW9wdC0+cHNfam9pbiA9IGZhbHNlOwotCXNsdXJtX2N0bF9jb25mX3QgKiBzbHVybV9jdGxfY29uZl9wdHI7Ci0Jc2x1cm1fbG9hZF9jdGxfY29uZigodGltZV90KU5VTEwsICZzbHVybV9jdGxfY29uZl9wdHIpOwotCW9wdC0+cHNfbWF4X3dhaXQgPSBzbHVybV9jdGxfY29uZl9wdHItPndhaXRfdGltZTsKLQotCW9wdC0+cHNfcXVpdF9vbl9pbnRyID0gZmFsc2U7Ci0Jb3B0LT5wc19kaXNhYmxlX3N0YXR1cyA9IGZhbHNlOwotCW9wdC0+cHNfdGVzdF9vbmx5ICAgPSBmYWxzZTsKLQkKLQlvcHQtPnBzX3F1aWV0ID0gMDsKLQotCW9wdC0+cHNfam9iX21pbl9jcHVzICAgID0gTk9fVkFMOwotCW9wdC0+cHNfam9iX21pbl9zb2NrZXRzID0gTk9fVkFMOwotCW9wdC0+cHNfam9iX21pbl9jb3JlcyAgID0gTk9fVkFMOwotCW9wdC0+cHNfam9iX21pbl90aHJlYWRzID0gTk9fVkFMOwotCW9wdC0+cHNfam9iX21pbl9tZW1vcnkgID0gTk9fVkFMOwotCW9wdC0+cHNfdGFza19tZW0gICAgICAgID0gTk9fVkFMOwotCW9wdC0+cHNfam9iX21pbl90bXBfZGlzaz0gTk9fVkFMOwotCi0Jb3B0LT5wc19ob2xkID0gZmFsc2U7Ci0Jb3B0LT5wc19jb25zdHJhaW50cyA9IE5VTEw7Ci0Jb3B0LT5wc19jb250aWd1b3VzID0gZmFsc2U7Ci0Jb3B0LT5wc19ub2RlbGlzdCA9IE5VTEw7Ci0Jb3B0LT5wc19leGNfbm9kZXMgPSBOVUxMOwotCW9wdC0+cHNfbWF4X2xhdW5jaF90aW1lID0gMTIwOy8qIDEyMCBzZWNvbmRzIHRvIGxhdW5jaCBqb2IgKi8KLQlvcHQtPnBzX21heF9leGl0X3RpbWVvdXQ9IDYwOyAvKiBXYXJuIHVzZXIgNjAgc2Vjb25kcyBhZnRlciB0YXNrIGV4aXQgKi8KLQkvKiBEZWZhdWx0IGxhdW5jaCBtc2cgdGltZW91dCAqLwotCW9wdC0+cHNfbXNnX3RpbWVvdXQgPSBzbHVybV9jdGxfY29uZl9wdHItPm1zZ190aW1lb3V0OyAgCi0KLQlmb3IgKGk9MDsgaTxTWVNURU1fRElNRU5TSU9OUzsgaSsrKQotCQlvcHQtPnBzX2dlb21ldHJ5W2ldID0gKHVpbnQxNl90KSBOT19WQUw7Ci0Jb3B0LT5wc19yZWJvb3QgPSBmYWxzZTsKLQlvcHQtPnBzX25vX3JvdGF0ZSA9IGZhbHNlOwotCW9wdC0+cHNfY29ubl90eXBlID0gKHVpbnQxNl90KSBOT19WQUw7Ci0Jb3B0LT5wc19ibHJ0c2ltYWdlID0gTlVMTDsKLQlvcHQtPnBzX2xpbnV4aW1hZ2UgPSBOVUxMOwotCW9wdC0+cHNfbWxvYWRlcmltYWdlID0gTlVMTDsKLQlvcHQtPnBzX3JhbWRpc2tpbWFnZSA9IE5VTEw7Ci0Jb3B0LT5wc19ldWlkID0gKHVpZF90KSAtMTsKLQlvcHQtPnBzX2VnaWQgPSAoZ2lkX3QpIC0xOwotCW9wdC0+cHNfcHJvcGFnYXRlID0gTlVMTDsgIC8qIHByb3BhZ2F0ZSBzcGVjaWZpYyBybGltaXRzICovCi0Jb3B0LT5wc19wcm9sb2cgPSBzbHVybV9jdGxfY29uZl9wdHItPnNydW5fcHJvbG9nOwotCW9wdC0+cHNfZXBpbG9nID0gc2x1cm1fY3RsX2NvbmZfcHRyLT5zcnVuX2VwaWxvZzsKLQlvcHQtPnBzX3Rhc2tfcHJvbG9nID0gTlVMTDsKLQlvcHQtPnBzX3Rhc2tfZXBpbG9nID0gTlVMTDsKLQlnZXRob3N0bmFtZV9zaG9ydChob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSk7Ci0Jb3B0LT5wc19jdHJsX2NvbW1faWZobiA9IHN0cmR1cChob3N0bmFtZSk7Ci0Jb3B0LT5wc19wdHkgPSBmYWxzZTsKLQlvcHQtPnBzX29wZW5fbW9kZSA9IDA7Ci0Jb3B0LT5wc19hY2N0Z19mcmVxID0gLTE7Ci0JCi0JaWYgKHNsdXJtX2N0bF9jb25mX3B0cikKLQkJc2x1cm1fZnJlZV9jdGxfY29uZihzbHVybV9jdGxfY29uZl9wdHIpOwotCQotCXJldHVybiAwOwotfQotCi0vKiAKLSAqIEluaXRpYWxpemUgb3B0aW9uIGRlZmF1bHRzLiAKLSAqLwotc3RhdGljIGludAotc2V0X3NydW5fb3B0aW9uc19kZWZhdWx0cyhzcnVuX29wdF90ICogb3B0KQotewotCXJldHVybiBvcHRfZGVmYXVsdChvcHQpOwotfQotCi0vKgotICogRnJlZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIGpvYiAib3B0Ii4gCi0gKi8KLXN0YXRpYyB2b2lkIAotZnJlZV9vcHQoc3J1bl9vcHRfdCAqIG9wdCkKLXsKLQlpZiAob3B0ID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChvcHQtPnBzX2N3ZF9zZXQgPT0gdHJ1ZSAmJiBvcHQtPnBzX2N3ZCAhPSBOVUxMKQotCQlmcmVlKG9wdC0+cHNfY3dkKTsKLQlpZiAob3B0LT5wc19ub2Rlc19zZXQgPT0gdHJ1ZSAmJiBvcHQtPnBzX25vZGVsaXN0ICE9IE5VTEwpCi0JCWZyZWUob3B0LT5wc19ub2RlbGlzdCk7Ci0JaWYgKG9wdC0+cHNfY3RybF9jb21tX2lmaG4pIC8qIGFsbG9jYXRlZCBpbiBvcHRfZGVmYXVsdCgpICovCi0JCWZyZWUob3B0LT5wc19jdHJsX2NvbW1faWZobik7Ci19Ci0KLS8qCi0gKiBGcmVlIHNwYWNlIGFsbG9jYXRlZCB0byBzYXZlIHNydW4gYXJncyBpbiBTTFVSTV9TdWJtaXRKb2IoKS4KLSAqLwotc3RhdGljIHZvaWQgCi1mcmVlX3NydW5fYXJndihpbnQgc3J1bl9hcmdjLGNoYXIgKiogc3J1bl9hcmd2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaTwgc3J1bl9hcmdjOyBpKyspIHsKLQkJaWYgKHNydW5fYXJndltpXSAhPSBOVUxMKQotCQkJZnJlZShzcnVuX2FyZ3ZbaV0pOwotCX0KLQotCWZyZWUoc3J1bl9hcmd2KTsKLX0KLQotCi0vKgotICogQ3JlYXRlIGpvYiBkZXNjLiBtc2cgZnJvbSBvcHRzIGZvciBqb2IgYWxsb2NhdGlvbi4KLSAqIEJ5IG5vdywgLXcvLXggb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KLSAqLwotc3RhdGljIGpvYl9kZXNjX21zZ190ICogCi1jcmVhdGVfam9iX2Rlc2NfbXNnX2Zyb21fb3B0cyhzcnVuX29wdF90ICpvcHQpCi17Ci0KLQlqb2JfZGVzY19tc2dfdCAqIGogPSBOVUxMOwotCQotCWFzc2VydChvcHQgIT0gTlVMTCk7Ci0JaWYgKChqID0gKGpvYl9kZXNjX21zZ190ICopbWFsbG9jKHNpemVvZihqb2JfZGVzY19tc2dfdCkpKSA9PSBOVUxMKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgIkFsbG9jYXRlIGpvYl9kZXNnX21zZyBmYWlsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNsdXJtX2luaXRfam9iX2Rlc2NfbXNnKGopOwotCQotCWlmIChvcHQtPnBzX2FjY291bnQpCi0JCWotPmFjY291bnQgPSBzdHJkdXAob3B0LT5wc19hY2NvdW50KTsKLQotCWotPmNvbnRpZ3VvdXMgICAgID0gb3B0LT5wc19jb250aWd1b3VzOwotCWotPmZlYXR1cmVzICAgICAgID0gb3B0LT5wc19jb25zdHJhaW50czsKLQlqLT5pbW1lZGlhdGUgICAgICA9ICh1aW50MTZfdClvcHQtPnBzX2ltbWVkaWF0ZTsKLQlqLT5uYW1lICAgICAgICAgICA9IG9wdC0+cHNfam9iX25hbWU7Ci0KLQlpZiAob3B0LT5wc19ub2RlbGlzdCkgCi0JCWotPnJlcV9ub2RlcyA9IHN0cmR1cChvcHQtPnBzX25vZGVsaXN0KTsKLQkvKgotCSAqIEZJWE1FOiBoYW5kbGUgLXcgbm9kZWxpc3QgcmVxdWVzdAotCSAqLwotCS8qCi0JaWYoai0+cmVxX25vZGVzKSB7Ci0JCWhsID0gaG9zdGxpc3RfY3JlYXRlKGotPnJlcV9ub2Rlcyk7Ci0JCWhvc3RsaXN0X3JhbmdlZF9zdHJpbmcoaGwsIHNpemVvZihidWYpLCBidWYpOwotCQl4ZnJlZShvcHQubm9kZWxpc3QpOwotCQlvcHQubm9kZWxpc3QgPSB4c3RyZHVwKGJ1Zik7Ci0JCWhvc3RsaXN0X3VuaXEoaGwpOwotCQlob3N0bGlzdF9yYW5nZWRfc3RyaW5nKGhsLCBzaXplb2YoYnVmKSwgYnVmKTsKLQkJaG9zdGxpc3RfZGVzdHJveShobCk7Ci0JCXhmcmVlKGotPnJlcV9ub2Rlcyk7Ci0JCWotPnJlcV9ub2RlcyA9IHhzdHJkdXAoYnVmKTsKLQl9Ci0JKi8KLQlpZihvcHQtPnBzX2Rpc3RyaWJ1dGlvbiA9PSBTTFVSTV9ESVNUX0FSQklUUkFSWQotCSAgICYmICFqLT5yZXFfbm9kZXMpIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCJXaXRoIEFyYml0cmFyeSBkaXN0cmlidXRpb24geW91IG5lZWQgdG8gXAotCQkJCXNwZWNpZnkgYSBub2RlbGlzdCBvciBob3N0ZmlsZSB3aXRoIHRoZSAtdyBvcHRpb24iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWotPmV4Y19ub2RlcyA9IG9wdC0+cHNfZXhjX25vZGVzOwotCWotPnBhcnRpdGlvbiA9IG9wdC0+cHNfcGFydGl0aW9uOwotCWotPm1pbl9ub2RlcyA9IG9wdC0+cHNfbWluX25vZGVzOwotCWlmIChvcHQtPnBzX21pbl9zb2NrZXRzX3Blcl9ub2RlICE9IE5PX1ZBTCkKLQkJai0+bWluX3NvY2tldHMgPSAodWludDE2X3Qpb3B0LT5wc19taW5fc29ja2V0c19wZXJfbm9kZTsKLQlpZiAob3B0LT5wc19taW5fY29yZXNfcGVyX3NvY2tldCAhPSBOT19WQUwpCi0JCWotPm1pbl9jb3JlcyA9ICh1aW50MTZfdClvcHQtPnBzX21pbl9jb3Jlc19wZXJfc29ja2V0OwotCWlmIChvcHQtPnBzX21pbl90aHJlYWRzX3Blcl9jb3JlICE9IE5PX1ZBTCkKLQkJai0+bWluX3RocmVhZHMgPSAodWludDE2X3Qpb3B0LT5wc19taW5fdGhyZWFkc19wZXJfY29yZTsKLQlqLT51c2VyX2lkID0gb3B0LT5wc191aWQ7Ci0Jai0+ZGVwZW5kZW5jeSA9IG9wdC0+cHNfZGVwZW5kZW5jeTsKLQlpZiAob3B0LT5wc19uaWNlKQotCQlqLT5uaWNlID0gKHVpbnQxNl90KShOSUNFX09GRlNFVCArIG9wdC0+cHNfbmljZSk7Ci0Jai0+dGFza19kaXN0ID0gKHVpbnQxNl90KW9wdC0+cHNfZGlzdHJpYnV0aW9uOwotCWlmIChvcHQtPnBzX3BsYW5lX3NpemUgIT0gTk9fVkFMKQotCQlqLT5wbGFuZV9zaXplID0gKHVpbnQxNl90KW9wdC0+cHNfcGxhbmVfc2l6ZTsKLQlqLT5ncm91cF9pZCA9IG9wdC0+cHNfZ2lkOwotCWotPm1haWxfdHlwZSA9IG9wdC0+cHNfbWFpbF90eXBlOwotCi0JaWYgKG9wdC0+cHNfbnRhc2tzX3Blcl9ub2RlICE9IE5PX1ZBTCkKLQkJai0+bnRhc2tzX3Blcl9ub2RlID0gKHVpbnQxNl90KW9wdC0+cHNfbnRhc2tzX3Blcl9ub2RlOwotCWlmIChvcHQtPnBzX250YXNrc19wZXJfc29ja2V0ICE9IE5PX1ZBTCkKLQkJai0+bnRhc2tzX3Blcl9zb2NrZXQgPSAodWludDE2X3Qpb3B0LT5wc19udGFza3NfcGVyX3NvY2tldDsKLQlpZiAob3B0LT5wc19udGFza3NfcGVyX2NvcmUgIT0gTk9fVkFMKQotCQlqLT5udGFza3NfcGVyX2NvcmUgPSh1aW50MTZfdClvcHQtPnBzX250YXNrc19wZXJfY29yZTsKLQotCWlmIChvcHQtPnBzX21haWxfdXNlcikKLQkJai0+bWFpbF91c2VyID0gc3RyZHVwKG9wdC0+cHNfbWFpbF91c2VyKTsKLQlpZiAob3B0LT5wc19iZWdpbikKLQkJai0+YmVnaW5fdGltZSA9IG9wdC0+cHNfYmVnaW47Ci0JaWYgKG9wdC0+cHNfbGljZW5zZXMpCi0JCWotPmxpY2Vuc2VzID0gc3RyZHVwKG9wdC0+cHNfbGljZW5zZXMpOwotCWlmIChvcHQtPnBzX25ldHdvcmspCi0JCWotPm5ldHdvcmsgPSBzdHJkdXAob3B0LT5wc19uZXR3b3JrKTsKLQlpZiAob3B0LT5wc19jb21tZW50KQotCQlqLT5jb21tZW50ID0gc3RyZHVwKG9wdC0+cHNfY29tbWVudCk7Ci0KLQlpZiAob3B0LT5wc19ob2xkKQotCQlqLT5wcmlvcml0eSA9IDA7Ci0JaWYgKG9wdC0+cHNfam9iaWQgIT0gTk9fVkFMKQotCQlqLT5qb2JfaWQgPSBvcHQtPnBzX2pvYmlkOwotCi0JI2lmIFNZU1RFTV9ESU1FTlNJT05TCi0JaWYgKG9wdC0+cHNfZ2VvbWV0cnlbMF0gPiAwKSB7Ci0JCWludCBpOwotCQlmb3IgKGk9MDsgaTxTWVNURU1fRElNRU5TSU9OUzsgaSsrKQotCQkJai0+Z2VvbWV0cnlbaV0gPSBvcHQtPnBzX2dlb21ldHJ5W2ldOwotCX0KLQkjZW5kaWYKLQotCWlmIChvcHQtPnBzX2Nvbm5fdHlwZSAhPSAodWludDE2X3QpIE5PX1ZBTCkKLQkJai0+Y29ubl90eXBlID0gb3B0LT5wc19jb25uX3R5cGU7Ci0JCQkKLQlpZiAob3B0LT5wc19yZWJvb3QpCi0JCWotPnJlYm9vdCA9IDE7Ci0JaWYgKG9wdC0+cHNfbm9fcm90YXRlKQotCQlqLT5yb3RhdGUgPSAwOwotCi0JaWYgKG9wdC0+cHNfYmxydHNpbWFnZSkKLQkJai0+YmxydHNpbWFnZSA9IHN0cmR1cChvcHQtPnBzX2JscnRzaW1hZ2UpOwotCWlmIChvcHQtPnBzX2xpbnV4aW1hZ2UpCi0JCWotPmxpbnV4aW1hZ2UgPSBzdHJkdXAob3B0LT5wc19saW51eGltYWdlKTsKLQlpZiAob3B0LT5wc19tbG9hZGVyaW1hZ2UpCi0JCWotPm1sb2FkZXJpbWFnZSA9IHN0cmR1cChvcHQtPnBzX21sb2FkZXJpbWFnZSk7Ci0JaWYgKG9wdC0+cHNfcmFtZGlza2ltYWdlKQotCQlqLT5yYW1kaXNraW1hZ2UgPSBzdHJkdXAob3B0LT5wc19yYW1kaXNraW1hZ2UpOwotCi0JaWYgKG9wdC0+cHNfbWF4X25vZGVzKQotCQlqLT5tYXhfbm9kZXMgPSBvcHQtPnBzX21heF9ub2RlczsKLQlpZiAob3B0LT5wc19tYXhfc29ja2V0c19wZXJfbm9kZSkKLQkJai0+bWF4X3NvY2tldHMgPSBvcHQtPnBzX21heF9zb2NrZXRzX3Blcl9ub2RlOwotCWlmIChvcHQtPnBzX21heF9jb3Jlc19wZXJfc29ja2V0KQotCQlqLT5tYXhfY29yZXMgPSBvcHQtPnBzX21heF9jb3Jlc19wZXJfc29ja2V0OwotCWlmIChvcHQtPnBzX21heF90aHJlYWRzX3Blcl9jb3JlKQotCQlqLT5tYXhfdGhyZWFkcyA9IG9wdC0+cHNfbWF4X3RocmVhZHNfcGVyX2NvcmU7Ci0KLQlpZiAob3B0LT5wc19qb2JfbWluX2NwdXMgIT0gTk9fVkFMKQotCQlqLT5qb2JfbWluX3Byb2NzID0gb3B0LT5wc19qb2JfbWluX2NwdXM7Ci0JaWYgKG9wdC0+cHNfam9iX21pbl9zb2NrZXRzICE9IE5PX1ZBTCkKLQkJai0+am9iX21pbl9zb2NrZXRzID0gb3B0LT5wc19qb2JfbWluX3NvY2tldHM7Ci0JaWYgKG9wdC0+cHNfam9iX21pbl9jb3JlcyAhPSBOT19WQUwpCi0JCWotPmpvYl9taW5fY29yZXMgPSBvcHQtPnBzX2pvYl9taW5fY29yZXM7Ci0JaWYgKG9wdC0+cHNfam9iX21pbl90aHJlYWRzICE9IE5PX1ZBTCkKLQkJai0+am9iX21pbl90aHJlYWRzID0gb3B0LT5wc19qb2JfbWluX3RocmVhZHM7Ci0JaWYgKG9wdC0+cHNfam9iX21pbl9tZW1vcnkgIT0gTk9fVkFMKQotCQlqLT5qb2JfbWluX21lbW9yeSA9IG9wdC0+cHNfam9iX21pbl9tZW1vcnk7Ci0JaWYgKG9wdC0+cHNfam9iX21pbl90bXBfZGlzayAhPSBOT19WQUwpCi0JCWotPmpvYl9taW5fdG1wX2Rpc2sgPSBvcHQtPnBzX2pvYl9taW5fdG1wX2Rpc2s7Ci0JaWYgKG9wdC0+cHNfb3ZlcmNvbW1pdCkgewotCQlqLT5udW1fcHJvY3MgID0gb3B0LT5wc19taW5fbm9kZXM7Ci0JCWotPm92ZXJjb21taXQgPSBvcHQtPnBzX292ZXJjb21taXQ7Ci0JfSBlbHNlCi0JCWotPm51bV9wcm9jcyAgPSBvcHQtPnBzX25wcm9jcyAqIG9wdC0+cHNfY3B1c19wZXJfdGFzazsKLQlpZiAob3B0LT5wc19ucHJvY3Nfc2V0KQotCQlqLT5udW1fdGFza3MgID0gb3B0LT5wc19ucHJvY3M7Ci0KLQlpZiAob3B0LT5wc19jcHVzX3NldCkKLQkJai0+Y3B1c19wZXJfdGFzayA9IG9wdC0+cHNfY3B1c19wZXJfdGFzazsKLQotCWlmIChvcHQtPnBzX25vX2tpbGwpCi0JCWotPmtpbGxfb25fbm9kZV9mYWlsID0gMDsKLQlpZiAob3B0LT5wc190aW1lX2xpbWl0ICE9IE5PX1ZBTCkKLQkJai0+dGltZV9saW1pdCAgPSBvcHQtPnBzX3RpbWVfbGltaXQ7Ci0Jai0+c2hhcmVkID0gb3B0LT5wc19zaGFyZWQ7Ci0KLQkvKgotCSAqIHNydW4gdXNlcyB0aGUgc2FtZSBsaXN0ZW5pbmcgcG9ydCBmb3IgdGhlIGFsbG9jYXRpb24gcmVzcG9uc2UKLQkgKiBtZXNzYWdlIGFzIGZvciBhbGwgb3RoZXIgbWVzc2FnZS4KLQkgKiBzbHVybWN0bGRfY29tbV9hZGRyIHN0cnVjdHVyZSBpbml0aWFsaXplZCBieSBzbHVybWN0bGRfbXNnX2luaXQoKQotCSAqLwotCWotPmFsbG9jX3Jlc3BfcG9ydCA9IHNsdXJtY3RsZF9jb21tX2FkZHIucG9ydDsKLQlqLT5vdGhlcl9wb3J0ID0gc2x1cm1jdGxkX2NvbW1fYWRkci5wb3J0OwotCi0JcmV0dXJuIGo7Ci19Ci0KLS8qCi0gKiBDYWxsYmFjayBoYW5kbGVycyBmb3Igam9iIGFsbG9jYXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkIAotdGltZW91dF9oYW5kbGVyKHNydW5fdGltZW91dF9tc2dfdCAqbXNnKQotewotCXN0YXRpYyB0aW1lX3QgbGFzdF90aW1lb3V0ID0gMDsKLQotCWlmIChtc2ctPnRpbWVvdXQgIT0gbGFzdF90aW1lb3V0KSB7Ci0JCWxhc3RfdGltZW91dCA9IG1zZy0+dGltZW91dDsKLQkJZGVidWdfbG9nKGxvZ2ZwLCJjYWxsYmFjay0tLT50aW1lb3V0X2hhbmRsZXI6Iik7Ci0JCWRlYnVnX2xvZyhsb2dmcCwiam9iIHRpbWUgbGltaXQgdG8gYmUgcmVhY2hlZCBhdCAlcyIsIAotCQkJY3RpbWUoJm1zZy0+dGltZW91dCkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgCi11c2VyX21zZ19oYW5kbGVyKHNydW5fdXNlcl9tc2dfdCAqbXNnKQotewotCWRlYnVnX2xvZyhsb2dmcCwiY2FsbGJhY2stLS0+dXNyX21zZ19oYW5kbGVyOiAlcyIsIG1zZy0+bXNnKTsKLX0KLQotc3RhdGljIHZvaWQKLXBpbmdfaGFuZGxlcihzcnVuX3BpbmdfbXNnX3QgKm1zZykgCi17Ci0JZGVidWdfbG9nKGxvZ2ZwLCJjYWxsYmFjay0tLT5waW5ndF9oYW5kbGVyOiIpOwotfQotCi0KLXN0YXRpYyB2b2lkIAotbm9kZV9mYWlsX2hhbmRsZXIoc3J1bl9ub2RlX2ZhaWxfbXNnX3QgKm1zZykKLXsKLQlkZWJ1Z19sb2cobG9nZnAsImNhbGxiYWNrLS0tPm5vZGVfZmFpbF9oYW5kbGVyOiBOb2RlIGZhaWx1cmUgb24gJXMiLCBtc2ctPm5vZGVsaXN0KTsKLX0KLQotc3RhdGljIHZvaWQgCi1qb2JfY29tcGxldGVfaGFuZGxlcihzcnVuX2pvYl9jb21wbGV0ZV9tc2dfdCAqIG1zZykKLXsKLQlkZWJ1Z19sb2cobG9nZnAsImNhbGxiYWNrLS0tPmpvYl9jb21wbGV0ZV9oYW5kbGVyOiBGb3JjZSBUZXJtaW5hdGUgam9iXG4iKTsKLX0KLQotc3RhdGljIGJvb2wgCi13YWl0X3JldHJ5KCkKLXsKLQlzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotCWlmIChjb3VudCA8IE1BWF9SRVRSSUVTKSB7Ci0JCXNsZWVwKCsrY291bnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9ZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi0gKiBJbnN0YWxsIHNpZ25vIGhhbmRsZXIuCi0gKi8KLXN0YXRpYyBTaWdGdW5jICoKLXhzaWduYWwoaW50IHNpZ25vLCBTaWdGdW5jICpmKQotewotCXN0cnVjdCBzaWdhY3Rpb24gc2EsIG9sZF9zYTsKLQotCXNhLnNhX2hhbmRsZXIgPSBmOwotCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLQlzaWdhZGRzZXQoJnNhLnNhX21hc2ssIHNpZ25vKTsKLQlzYS5zYV9mbGFncyA9IDA7Ci0JaWYgKHNpZ2FjdGlvbihzaWdubywgJnNhLCAmb2xkX3NhKSA8IDApCi0JCWRlYnVnX2xvZyhsb2dmcCwieHNpZ25hbCglZCkgZmFpbGVkOiAlbSIsIHNpZ25vKTsKLQotCXJldHVybiBvbGRfc2Euc2FfaGFuZGxlcjsKLX0KLQotLyoKLSAqIFNpZ25hbCBoYW5kbGVyIGR1cmluZyBhbGxvY2F0aW5nIGpvYnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1zaWduYWxfd2hpbGVfYWxsb2NhdGluZyhpbnQgc2lnbm8pCi17Ci0JZGVzdHJveV9qb2IgPSAxOwotCWlmIChzeW5jX21zZ19hZGRyICYmIChzeW5jX21zZ19hZGRyLT5zbHVybV9qb2JpZCA+IDApKSAKLQkJc2x1cm1fY29tcGxldGVfam9iKHN5bmNfbXNnX2FkZHItPnNsdXJtX2pvYmlkLCAwKTsKLX0KLQotCi0vKgotICogUGVuZGluZyBjYWxsYmFjayBkdXJpbmcgYmxvY2sgam9iIGFsbG9jYXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1zZXRfcGVuZGluZ19qb2JpZCh1aW50MzJfdCBpZCkKLXsKLQkvKiAKLQkgKiBUaGlzIGNhbGxiYWNrIGNhbiBzZXQgdGhlIGpvYmlkIGV2ZW4gaW4gdGhlIGNhc2Ugb2YgYmxvY2tpbmcgYWxsb2NhdGlvbi4KLQkgKiBTbyBwcm94eSBhZ2VudCBjYW4gZ2V0IHRoZSBzbHVybSBqb2JpZCBhbmQgd2lsbCBub3QgYmxvY2sgLgotCSAqLwotCSBpZiAoc3luY19tc2dfYWRkciAhPSBOVUxMKSB7Ci0JCXN5bmNfbXNnX2FkZHItPnNsdXJtX2pvYmlkID0gKGludCkgaWQ7Ci0JCXN5bmNfbXNnX2FkZHItPmpvYmlkX3NldCA9IHRydWU7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCAKLWlnbm9yZV9zaWduYWwoaW50IHNpZ25vKQotewotCS8qZG8gbm90aGluZyovCi19Ci0KLS8qCi0gKiBSZWxlYXNlIGFsbG9jYXRlZCBtZW1vcnkgaW4gam9iX2Rlc2NfbXNnLgotICovCi1zdGF0aWMgdm9pZCAKLWRlc3Ryb3lfam9iX2Rlc2NfbXNnKGpvYl9kZXNjX21zZ190ICogaikKLXsKLQlpZiAoaiAhPSBOVUxMKSB7Ci0JCWlmIChqLT5hY2NvdW50ICE9IE5VTEwpCi0JCQlmcmVlKGotPmFjY291bnQpOwotCQlpZiAoai0+cmVxX25vZGVzICE9IE5VTEwpIAotCQkJZnJlZShqLT5yZXFfbm9kZXMpOwotCQlpZiAoai0+bWFpbF91c2VyICE9IE5VTEwpCi0JCQlmcmVlKGotPm1haWxfdXNlcik7Ci0JCWlmIChqLT5saWNlbnNlcyAhPSBOVUxMKQotCQkJZnJlZShqLT5saWNlbnNlcyk7Ci0JCWlmIChqLT5uZXR3b3JrICE9IE5VTEwpCi0JCQlmcmVlKGotPm5ldHdvcmspOwotCQlpZiAoai0+Y29tbWVudCAhPSBOVUxMKQotCQkJZnJlZShqLT5jb21tZW50KTsKLQkJaWYgKGotPmJscnRzaW1hZ2UgIT0gTlVMTCkKLQkJCWZyZWUoai0+YmxydHNpbWFnZSk7Ci0JCWlmIChqLT5saW51eGltYWdlICE9IE5VTEwpCi0JCQlmcmVlKGotPmxpbnV4aW1hZ2UpOwotCQlpZiAoai0+bWxvYWRlcmltYWdlICE9IE5VTEwpCi0JCQlmcmVlKGotPm1sb2FkZXJpbWFnZSk7Ci0JCWlmIChqLT5yYW1kaXNraW1hZ2UgIT0gTlVMTCkKLQkJCWZyZWUoai0+cmFtZGlza2ltYWdlKTsKLQotCQlmcmVlKGopOwotCX0KLX0KLQotLyoKLSAqIENyZWF0ZSBhIHNvY2tldCB0byBjb21tdW5pY2F0ZSB3aXRoIHNsdXJtY3RsZCAKLSAqIGR1cmluZyBqb2IgYWxsb2NhdGlvbi4gVGhpcyBmZCB3aWxsIGJlIGNsb3NlZAotICogb24gZXhlY3V0aW5nIHNydW4gYWZ0ZXIgam9iIGFsbG9jYXRpb24uCi0gKi8KLXNsdXJtX2ZkIAotc2x1cm1faW5pdF9tc2dfZW5naW5lX3BvcnQodWludDE2X3QgcG9ydCkKLXsKLQlzbHVybV9hZGRyIGFkZHI7Ci0KLQlpbnQgZmQ7Ci0JaW50IHJjOwotCWNvbnN0IGludCBvbmUgPSAxOwotCWNvbnN0IHNpemVfdCBzejEgPSBzaXplb2Yob25lKTsKLQotCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCWFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0KLQlpZiAoKGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkpIDwgMCkgewotCQlkZWJ1Z19sb2cobG9nZnAsImNyZWF0ZSBzbHVybWN0bGQgc29ja2V0IGVycm9yXG4iKTsKLQkJcmV0dXJuIGZkOwotCX0KLQlyYyA9IHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwmb25lLHN6MSk7Ci0JaWYgKHJjIDwgMCkgewotCQlnb3RvIGVycm9yOwotCX0KLQlyYyA9IGJpbmQoZmQsICZhZGRyLCBzaXplb2YoYWRkcikpOwotCWlmIChyYyA8IDApIHsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcmMgPSBsaXN0ZW4oZmQsIDEyOCk7Ci0JaWYocmMgPCAwKSB7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCQotCXJldHVybiBmZDsKLQotZXJyb3I6Ci0JaWYgKChjbG9zZShmZCkgPCAwKSAmJiAoZXJybm8gPT0gRUlOVFIpKQotCQljbG9zZShmZCk7IC8qdHJ5IGFnYWluKi8KLQlyZXR1cm4gcmM7Ci19Ci0KLQotLyogCi0gKiBJbml0IHNvY2tldCBmZCB0byBoYW5kbGUgbWVzc2FnZSBmcm9tIHNsdXJtY3RsZC4KLSAqLwotc2x1cm1fZmQgCi1zbHVybWN0bGRfbXNnX2luaXQoc3J1bl9vcHRfdCAqIG9wdCkKLXsKLQlzbHVybV9hZGRyIHNsdXJtX2FkZHJlc3M7Ci0JdWludDE2X3QgcG9ydDsKLQlzdGF0aWMgc2x1cm1fZmQgc2x1cm1jdGxkX2ZkID0gMDsKLQlzb2NrbGVuX3QgbmFtZV9sZW47Ci0JaW50IGZ2YWw7Ci0JaW50IHJjOwotCQotCWlmIChzbHVybWN0bGRfZmQpCi0JCXJldHVybiBzbHVybWN0bGRfZmQ7Ci0KLQlzbHVybWN0bGRfZmQgPSAtMTsKLQlzbHVybWN0bGRfY29tbV9hZGRyLmhvc3RuYW1lID0gTlVMTDsKLQlzbHVybWN0bGRfY29tbV9hZGRyLnBvcnQgPSAwOwotCQotCS8qIG9wZW4gc29ja2V0ICovCi0JaWYgKChzbHVybWN0bGRfZmQgPSBzbHVybV9pbml0X21zZ19lbmdpbmVfcG9ydCgwKSkgPCAwKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgInNsdXJtX2luaXRfbXNnX2VuZ2luZV9wb3J0IGVycm9yXG4iKTsKLQkJcmV0dXJuIC0xOwkKLQl9Ci0KLQkvKiBnZXQgc29ja2V0IHBvcnQgbnVtYmVyICovCQotCW5hbWVfbGVuID0gc2l6ZW9mKHNsdXJtX2FkZHJlc3MpOwotCWlmICgocmMgPSBnZXRzb2NrbmFtZShzbHVybWN0bGRfZmQsICZzbHVybV9hZGRyZXNzLCAmbmFtZV9sZW4pKSA8IDApIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCAiZ2V0c29ja25hbWUgZXJyb3JcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogc2V0IG5vbi1ibG9ja2luZyAqLwotCWZ2YWwgPSBmY250bChzbHVybWN0bGRfZmQsIEZfR0VURkwsIDApOwotCWZjbnRsKHNsdXJtY3RsZF9mZCwgRl9TRVRGTCwgZnZhbHxPX05PTkJMT0NLKTsKLQotCS8qIHNldCBGRF9DTE9FWEVDOiBjbG9zZSBzbHVybWN0bGRfZmQgd2hlbiBleGVjKHNydW4pIGFmdGVyIGFsbG9jYXRpb24gKi8KLQlmdmFsID0gZmNudGwoc2x1cm1jdGxkX2ZkLCBGX0dFVEZELCAwKTsKLQlmY250bChzbHVybWN0bGRfZmQsIEZfU0VURkQsIGZ2YWx8RkRfQ0xPRVhFQyk7Ci0JCi0JLyogc2V0IGdsb2JhbCB2YXIuOiBzbHVybWN0bGRfY29tbV9hZGRyICovCi0Jc2x1cm1jdGxkX2NvbW1fYWRkci5ob3N0bmFtZSA9IHN0cmR1cChvcHQtPnBzX2N0cmxfY29tbV9pZmhuKTsKLQlwb3J0ID0gbnRvaHMoc2x1cm1fYWRkcmVzcy5zaW5fcG9ydCk7Ci0Jc2x1cm1jdGxkX2NvbW1fYWRkci5wb3J0ID0gcG9ydDsKLQotCXJldHVybiBzbHVybWN0bGRfZmQ7Ci19Ci0KLS8qCi0gKiBBbGxvY2F0ZSBqb2IgcmVzb3VyY2UgaW4gcmVzcG9uc2UgdG8gU3VibWl0Sm9iIGNtZC4KLSAqIENhbGxlZCBpbiBjaGlsZCBwcm9jZXNzIAotICovCi1zdGF0aWMgcmVzb3VyY2VfYWxsb2NhdGlvbl9yZXNwb25zZV9tc2dfdCAqCi1hbGxvY2F0ZV9ub2RlcyhzcnVuX29wdF90ICpvcHQpCi17Ci0JcmVzb3VyY2VfYWxsb2NhdGlvbl9yZXNwb25zZV9tc2dfdCAqcmVzcCA9IE5VTEw7Ci0Jc2x1cm1fYWxsb2NhdGlvbl9jYWxsYmFja3NfdCBjYWxsYmFja3M7Ci0KLQlzbHVybWN0bGRfbXNnX2luaXQob3B0KTsKLQlqb2JfZGVzY19tc2dfdCAqaiA9IGNyZWF0ZV9qb2JfZGVzY19tc2dfZnJvbV9vcHRzKG9wdCk7Ci0JaWYgKCFqKSAKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JLyogCi0JICogRG8gbm90IHJlLXVzZSBleGlzdGluZyBqb2IgaWQgd2hlbiBzdWJtaXR0aW5nIG5ldyBqb2IKLQkgKiBmcm9tIHdpdGhpbiBhIHJ1bm5pbmcgam9iIAotCSAqLwotCWlmICgoai0+am9iX2lkICE9IE5PX1ZBTCkgJiYgIW9wdC0+cHNfam9iaWRfc2V0KSB7Ci0JCWlmICghb3B0LT5wc19qb2JpZF9zZXQpCS8qIExldCBzbHVybWN0bGQgc2V0IGpvYmlkICovCi0JCQlqLT5qb2JfaWQgPSBOT19WQUw7Ci0JfQotCWNhbGxiYWNrcy5waW5nID0gcGluZ19oYW5kbGVyOwotCWNhbGxiYWNrcy50aW1lb3V0ID0gdGltZW91dF9oYW5kbGVyOwotCWNhbGxiYWNrcy5qb2JfY29tcGxldGUgPSBqb2JfY29tcGxldGVfaGFuZGxlcjsKLQljYWxsYmFja3MudXNlcl9tc2cgPSB1c2VyX21zZ19oYW5kbGVyOwotCWNhbGxiYWNrcy5ub2RlX2ZhaWwgPSBub2RlX2ZhaWxfaGFuZGxlcjsKLQotCS8qIGNyZWF0ZSBtZXNzYWdlIHRocmVhZCB0byBoYW5kbGUgcGluZ3MgYW5kIHN1Y2ggZnJvbSBzbHVybWN0bGQgKi8KLQltc2dfdGhyID0gc2x1cm1fYWxsb2NhdGlvbl9tc2dfdGhyX2NyZWF0ZSgmai0+b3RoZXJfcG9ydCwgJmNhbGxiYWNrcyk7Ci0KLQl4c2lnbmFsKFNJR0hVUCwgc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcpOwotCXhzaWduYWwoU0lHSU5ULCBzaWduYWxfd2hpbGVfYWxsb2NhdGluZyk7Ci0JeHNpZ25hbChTSUdRVUlULCBzaWduYWxfd2hpbGVfYWxsb2NhdGluZyk7Ci0JeHNpZ25hbChTSUdQSVBFLCBzaWduYWxfd2hpbGVfYWxsb2NhdGluZyk7Ci0JeHNpZ25hbChTSUdURVJNLCBzaWduYWxfd2hpbGVfYWxsb2NhdGluZyk7Ci0JeHNpZ25hbChTSUdVU1IxLCBzaWduYWxfd2hpbGVfYWxsb2NhdGluZyk7Ci0JeHNpZ25hbChTSUdVU1IyLCBzaWduYWxfd2hpbGVfYWxsb2NhdGluZyk7Ci0KLS8vCXdoaWxlICghcmVzcCkgCi0JewotCQkvKiAKLQkJICogQkxPQ0sgdW5pdGwgYWxsb2NhdGlvbiBncmFudGVkIG9yIGludGVycnVwdCBieSBzaWduYWwKLQkJICogaWYgYWxsb2NhdGlvbiBibG9ja2VkL3BlbmRpbmcsIAotCQkgKiB0aGUgam9iaWQgY2FuIGJlIHJldHVybmVkIHRvIHBhcmVudCBieSAnc2V0X3BlbmRpbmdfam9iaWQnIGNhbGxiYWNrCi0JCSAqLwotCQlyZXNwID0gc2x1cm1fYWxsb2NhdGVfcmVzb3VyY2VzX2Jsb2NraW5nKGosIDAsIHNldF9wZW5kaW5nX2pvYmlkKTsKLQkJaWYgKHJlc3AgPT0gTlVMTCkKLQkJCWRlYnVnX2xvZyhsb2dmcCwgImJsb2NraW5nIGpvYiBhbGxvY2F0ZSBlcnJvciFcbiIpOwotLy8JCWlmIChkZXN0cm95X2pvYikgLyogaW50ZXJydXB0IGJ5IHNpZ25hbCAqLwotLy8JCQlicmVhazsKLS8vCSAJZWxzZSBpZighcmVzcCAmJiAhd2FpdF9yZXRyeSgpKSAvKiB0aW1lIG91dCAqLyAKLS8vCQkJYnJlYWs7CQkKLQl9Ci0JCi0KLQl4c2lnbmFsKFNJR0hVUCwgaWdub3JlX3NpZ25hbCk7Ci0JeHNpZ25hbChTSUdJTlQsIGlnbm9yZV9zaWduYWwpOwotCXhzaWduYWwoU0lHUVVJVCwgaWdub3JlX3NpZ25hbCk7Ci0JeHNpZ25hbChTSUdQSVBFLCBpZ25vcmVfc2lnbmFsKTsKLQl4c2lnbmFsKFNJR1RFUk0sIGlnbm9yZV9zaWduYWwpOwotCXhzaWduYWwoU0lHVVNSMSwgaWdub3JlX3NpZ25hbCk7Ci0JeHNpZ25hbChTSUdVU1IyLCBpZ25vcmVfc2lnbmFsKTsKLQotCWRlc3Ryb3lfam9iX2Rlc2NfbXNnKGopOwotCXJldHVybiByZXNwOwotfQotCi1zdGF0aWMgaW50IAotaGFuZGxlX2F0dGFjaF9kZWJ1ZygpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgCi1oYW5kbGVfZGVidWcoKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogQ3JlYXRlIGEgdGhyZWFkIHRvIHJldHJpZXZlIHNydW4ncyBzdGRvdXQvc3RkZXJyLAotICogYW5kIHNlbmQgdG8gcHRwIHVpLgotICovCi1zdGF0aWMgaW50IAotY3JlYXRlX2lvdGhyZWFkKHB0cF9qb2IgKiBqb2IpCi17Ci0JcHRocmVhZF9hdHRyX3QgYXR0cjsKLQlwdGhyZWFkX3QgaW90aHJlYWRfaWQ7Ci0JaW50IHJjOwotCQkJCQotCXB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKLQlwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKLQlpZiAocHRocmVhZF9jcmVhdGUoJmlvdGhyZWFkX2lkLCAmYXR0ciwgc3J1bl9vdXRwdXRfZm9yd2FyZGluZywgKHZvaWQgKilqb2IpID09IDAgKSB7Ci0JCWpvYi0+aW90aHJlYWRfaWQgPSBpb3RocmVhZF9pZDsKLQkJZGVidWdfbG9nKGxvZ2ZwLCAiaW90aHJlYWQgY3JlYXRlZCBmb3Igam9iWyVkXS5cbiIsIGpvYi0+c2x1cm1fam9iaWQpOwotCQlyYyA9IDA7Ci0JfSBlbHNlIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCJlcnJvciBvbiBjcmVhdGluZyBpb3RocmVhZCBmb3Igam9iWyVkXS5cbiIsIGpvYi0+c2x1cm1fam9iaWQpOwotCQlyYyA9ICAtMTsKLQl9CQotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogQWxsb2NhdGUgam9iIHJlc291cmNlIGlmIG5lY2Vzc2FyeSwgbGF1bmNoIGpvYgotICogYW5kIGZvcndhcmQgam9iIHN0ZG91dC9zdGRlcnIgdG8gcHRwIHVpLiAKLSAqLwotc3RhdGljIGludCAKLWFsbG9jYXRlX2FuZF9sYXVuY2hfam9iKGludCB0cmFuc19pZCwgY2hhciAqIGpvYnN1YmlkLCBwdHBfam9iICogaW4sIHNydW5fb3B0X3QgKiBvcHQsIGludCBzcnVuX2FyZ2MsIGNoYXIgKiBzcnVuX2FyZ3ZbXSkKLXsKLQlpbnQgaTsKLQlpbnQgc2htaWQ7Ci0JaW50IGZkX291dFsyXTsKLQlpbnQgZmRfZXJyWzJdOwotCWJvb2wgbmVlZF9hbGxvYzsKLQlwaWRfdCBwaWQ7Ci0JaW50IHJjOwotCWNoYXIgKiBwdHI7Ci0Jc3luY19tc2cgKiBwcCwgKnBjOwotCWNoYXIgKiBtc2c7Ci0JcHRwX2pvYiAqIGpvYjsKLQljaGFyICogbmFtZTsKLQlwdHBfcHJvY2VzcyAgKiBwOwotCWludCBub2RlX2lkID0gLTE7Ci0JaW50IHRhc2tfaWQgPSAtMTsKLQlpbnQgcHJvY19waWQgPSAtMTsKLQlwdHBfbWFjaGluZSAqIG07Ci0JcHRwX25vZGUgKiBuOwotCWludCBraWxsX2pvYmlkID0gLTE7Ci0JaW50IGFsbG9jYXRlZF9qb2JpZCA9IC0xOwotCXJlc291cmNlX2FsbG9jYXRpb25fcmVzcG9uc2VfbXNnX3QgKiByZXNwID0gTlVMTDsKLQotCS8qIGNyZWF0ZSBhIHNoYXJlZCBtZW1vcnkgcmVnaW9uIHRvIGNvbW11bmlhdGUvc3luY2hyb25pemUgd2l0aCBjaGlsZCBwcm9jZXNzICovCi0JaWYgKChzaG1pZCA9IHNobWdldChJUENfUFJJVkFURSwgc2l6ZW9mKHN5bmNfbXNnKSwgU0hNX1J8U0hNX1cpKSA8IDApIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCJlcnJvciBvbiBjcmVhdGluZyBzaGFyZWQgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBpbml0IHNobSAqLwotCXBwID0gKHN5bmNfbXNnICopc2htYXQoc2htaWQsIDAsIDApOwotCXBwLT5zbHVybV9qb2JpZCA9IEpPQklEX0lOSVQ7Ci0JcHAtPmpvYmlkX3NldCA9IGZhbHNlOyAKLQlwcC0+aW9fcmVhZHkgPSBmYWxzZTsKLQotCXBpcGUoZmRfb3V0KTsKLQlwaXBlKGZkX2Vycik7IAotCQotCWlmIChvcHQtPnBzX2pvYmlkID09IE5PX1ZBTCAmJiBvcHQtPnBzX2pvYmlkX3NldCA9PSBmYWxzZSkKLQkJbmVlZF9hbGxvYyA9IHRydWU7Ci0JZWxzZSB7Ci0JCW5lZWRfYWxsb2MgPSBmYWxzZTsKLQkJYWxsb2NhdGVkX2pvYmlkID0gb3B0LT5wc19qb2JpZDsKLQl9CQotCi0Jc3dpdGNoIChwaWQgPSBmb3JrKCkpIHsKLQljYXNlIDA6CS8qIGNoaWxkOiBhbGxvY2F0ZSBqb2IgaWYgbmVjZXNzYXJ5IGFuZCBsYXVuY2ggam9iIHZpYSBzcnVuICovCi0JCS8qIGF0dGFjaCBzaG0gKi8KLQkJcGMgPSAoc3luY19tc2cgKilzaG1hdChzaG1pZCwgMCwgMCk7Ci0JCS8qCi0JCSAqIHNhdmUgc2htIGFkZHIgaW4gYSBnbG9iYWwgdmFyaWFibGUuCi0JCSAqIGlmIGpvYiBhbGxvY2F0aW9uIGJsb2NrZWQsIFNMVVJNIGNhbGxiYWNrIGNhbiBzdG9yZSB0aGUgcGVuZGluZyBqb2IgaWQgYXQgdGhpcyBhZGRyLCAKLQkJICogc28gcGFyZW50IGNhbiBnZXQgdGhlIHNsdXJtIGpvYmlkIHdpdGhvdXQgYmxvY2tpbmcuCi0JCSAqLwotCQlzeW5jX21zZ19hZGRyID0gcGM7Ci0KLQkJaWYgKG5lZWRfYWxsb2MpIHsgLyogcmVxdWlyZSBuZXcgam9iIGFsbG9jYXRpb24gKi8KLQkJCXJlc3AgPSBhbGxvY2F0ZV9ub2RlcyhvcHQpOwkJCQotCQkJaWYgKHJlc3AgPT0gTlVMTCB8fCByZXNwLT5ub2RlX2xpc3QgPT0gTlVMTCkgeyAvKiBhbGxvY2F0aW9uIGZhaWwsIHJhcmVseSBoYXBwZW4gKi8KLQkJCQlwYy0+c2x1cm1fam9iaWQgPSBKT0JJRF9GQUlMOwotCQkJCXBjLT5qb2JpZF9zZXQgPSB0cnVlOwotCQkJCXNobWR0KHBjKTsKLQkJCQlleGl0KEVYSVRfSk9CX0FMTE9DX0ZBSUwpOyAKLQkJCX0KLQotCQkJLyogYWxsb2NhdGlvbiBncmFudGVkICovCi0JCQlpZiAocGMtPmpvYmlkX3NldCAgPT0gZmFsc2UpIHsKLQkJCQlwYy0+c2x1cm1fam9iaWQgPSByZXNwLT5qb2JfaWQ7Ci0JCQkJcGMtPmpvYmlkX3NldCA9IHRydWU7Ci0JCQl9CQotCQkJCi0JCQlraWxsX2pvYmlkID0gcmVzcC0+am9iX2lkOwotCi0JCQlhc3ByaW50ZigmcHRyLCIlZCIsKGludClyZXNwLT5qb2JfaWQpOwotCQkJLyogc3J1biB3aWxsIG5vIG1vcmUgYWxsb2NhdGUgcmVzb3VyY2UgaWYgU0xVUk1fSk9CSUQgc2V0LiAqLwotCQkJc2V0ZW52KCJTTFVSTV9KT0JJRCIsIHB0ciwgMSk7Ci0JCQlmcmVlKHB0cik7Ci0JCQlpZiAocmVzcCkKLQkJCQlzbHVybV9mcmVlX3Jlc291cmNlX2FsbG9jYXRpb25fcmVzcG9uc2VfbXNnKHJlc3ApOwotCQl9Ci0JCWVsc2UgeyAKLQkJCS8qIAotCQkJICogcnVuIGluIGFsbG9jYXRlZCBqb2IgKHJlcXVpcmVkIGJ5IEFUVEFDSCBkZWJ1ZykKLQkJCSAqLwotCQkJcGMtPnNsdXJtX2pvYmlkID0gYWxsb2NhdGVkX2pvYmlkOwotCQkJcGMtPmpvYmlkX3NldCA9IHRydWU7Ci0JCQlhc3ByaW50ZigmcHRyLCIlZCIsYWxsb2NhdGVkX2pvYmlkKTsKLQkJCXNldGVudigiU0xVUk1fSk9CSUQiLCBwdHIsIDEpOwotCQkJZnJlZShwdHIpOwotCQl9Ci0JCS8qCi0JCSAqIEJMT0NLIHVudGlsIHBhcmVudCBzZXRzIGlvX3JlYWR5IHRvIHRydWUsCi0JCSAqIHdoaWNoIG1lYW5zIHRoZSBpbyB0aHJlYWQgaXMgcmVhZHkuCi0JCSAqIFBhcmVudCBzZXRzIHRoaXMgZmxhZyBhZnRlciBnZXR0aW5nIGpvYmlkIGFuZCBjcmVhdGUgaW90aHJlYWQuCi0JCSAqLwotCQl3aGlsZSAoIXBjLT5pb19yZWFkeSAmJiB3YWl0X3JldHJ5KCkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCFwYy0+aW9fcmVhZHkpIHsKLQkJCWlmIChuZWVkX2FsbG9jKXsKLQkJCQkvL3NsdXJtX2NvbXBsZXRlX2pvYihraWxsX2pvYmlkLCAwKTsKLQkJCQlzbHVybV9raWxsX2pvYihraWxsX2pvYmlkLCBTSUdLSUxMLCAwKTsKLQkJCX0JCi0JCQlzaG1kdChwYyk7Ci0JCQlkZWJ1Z19sb2cobG9nZnAsICJjaGlsZCBleGl0cyBkdWUgdG8gaW90aHJlYWQgZmFpbFxuIik7Ci0JCQlleGl0KEVYSVRfSk9CX0lPVEhSRUFEX0ZBSUwpOyAKLQkJfSBlbHNlIHsgLyogaW8gdGhyZWFkIHJlYWR5ICovCi0JCQlzaG1kdChwYyk7Ci0JCQkvKiByZWRpcmVjdCBzcnVuJ3Mgc3Rkb3V0IGFuZCBzdGRlcnIgKi8KLQkJCWNsb3NlKGZkX291dFswXSk7Ci0JCQljbG9zZShmZF9lcnJbMF0pOwotCQkJLyogam9iIHN0ZG91dCtzdGRlcnIgPT0+IHNydW4ncyBzdGRvdXQgKi8KLQkJCWR1cDIoZmRfb3V0WzFdLDEpOwotCQkJLyogc3J1biBvdXRwdXRzID09PiBzcnVuJ3Mgc3RkZXJyICovCi0JCQlkdXAyKGZkX2VyclsxXSwyKTsKLSAJCQkvKiBzcGF3biBqb2Igd2l0aCBzcnVuIGNtZCAqLwotCQkJcmMgPSBleGVjdnAoc3J1bl9hcmd2WzBdLCBzcnVuX2FyZ3YpOyAKLQkJCWlmIChyYyA8IDApIHsvKiByYXJlbHkgaGFwcGVucyAqLwotCQkJCWlmIChuZWVkX2FsbG9jKSB7Ci0JCQkJCS8vc2x1cm1fY29tcGxldGVfam9iKGtpbGxfam9iaWQsIDApOwotIAkJCQkJc2x1cm1fa2lsbF9qb2Ioa2lsbF9qb2JpZCwgU0lHS0lMTCwgMCk7Ci0JCQkJfQkKLQkJCQlkZWJ1Z19sb2cobG9nZnAsInNydW4gZXhlYyBmYWlsXG4iKTsKLQkJCQlleGl0KEVYSVRfRVhFQ19GQUlMKTsgCi0JCQl9CQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgLTE6LyogZXJyb3IgKi8KLQkJZGVidWdfbG9nKGxvZ2ZwLCJjaGlsZCBmb3JrIGVycm9yXG4iKTsKLQkJY2xvc2UoZmRfb3V0WzBdKTsKLQkJY2xvc2UoZmRfb3V0WzFdKTsKLQkJY2xvc2UoZmRfZXJyWzBdKTsKLQkJY2xvc2UoZmRfZXJyWzFdKTsKLQkJaWYgKHBwKQotCQkJc2htZHQocHApOwotCQlzaG1jdGwoc2htaWQsSVBDX1JNSUQsIDApOwotCQlyZXR1cm4gLTE7Ci0JZGVmYXVsdDovKiBwYXJlbnQgKi8KLQkJLyogCi0JCSAqIEJMT0NLIHVudGlsIGNoaWxkIHNldCB0aGUgc2x1cm0gam9iaWQgIAotCQkgKi8KLQkJd2hpbGUgKCFwcC0+am9iaWRfc2V0ICYmIHdhaXRfcmV0cnkoKSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFwcC0+am9iaWRfc2V0IHx8IHBwLT5zbHVybV9qb2JpZCA9PSBKT0JJRF9GQUlMKSB7IAotCQkJbXNnID0gIkpvYiBhbGxvY2F0aW9uIGZhaWwhXG5QbGVhc2UgY2hlY2sgUk1TIGFuZCBqb2IgY29uZmlnIHBhcmFtZXRlcnMhIjsKLQkJCWRlYnVnX2xvZyhsb2dmcCwgbXNnKTsKLQkJCXNlbmRKb2JTdWJFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JzdWJpZCwgbXNnKTsKLQkJCWNsb3NlKGZkX291dFswXSk7Ci0JCQljbG9zZShmZF9vdXRbMV0pOwotCQkJY2xvc2UoZmRfZXJyWzBdKTsKLQkJCWNsb3NlKGZkX2VyclsxXSk7Ci0JCQlzaG1kdChwcCk7Ci0JCQlraWxsKHBpZCwgU0lHS0lMTCk7IAotCQkJc2htY3RsKHNobWlkLCBJUENfUk1JRCwgMCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQkvKiBjZWF0ZSBqb2Igc3RydWN0dXJlIGFmdGVyIGdldHRpbmcgc2x1cm0gam9iaWQgKi8KLQkJaW4tPnNsdXJtX2pvYmlkID0gcHAtPnNsdXJtX2pvYmlkOwotCQlqb2IgPSBuZXdfam9iKGluLT5udW1fcHJvY3MsIGluLT5kZWJ1ZywgaW4tPnB0cF9qb2JpZCwgaW4tPnNsdXJtX2pvYmlkLCBpbi0+ZGVidWdfam9iaWQsIG5lZWRfYWxsb2MpOwotCQlqb2ItPnNydW5fcGlkID0gcGlkOwotCQkKLQkJCi0JCS8qIHNlbmQgT0sgZXZlbnQgZm9yIFN1Ym1pdEpvYiBjbWQgKi8JCi0JCXNlbmRPS0V2ZW50KHRyYW5zX2lkKTsKLQkKLQkJLyogc2VuZCBOZXdKb2IgZXZlbnQgKi8KLQkJYXNwcmludGYoJm5hbWUsIFNMVVJNX0pPQl9OQU1FX0ZNVCwgam9iLT5zbHVybV9qb2JpZCk7Ci0JCXNlbmROZXdKb2JFdmVudChnVHJhbnNJRCwgam9iLT5wdHBfam9iaWQsIG5hbWUsIGpvYnN1YmlkLCBKT0JfU1RBVEVfSU5JVCk7Ci0JCWZyZWUobmFtZSk7Ci0KLQkJLyoKLQkJICogQXMgcmVxdWlyZWQgYnkgcHRwIHVpLAotCQkgKiBvbmUgTmV3UHJvY2VzcyBFdmVudCBNVVNUIGJlIHNlbnQgZm9yIGVhY2ggcHJvY2VzcyBvZiB0aGlzIG5ldyBqb2IuCi0JCSAqLwotCQl0YXNrX2lkID0gMDsKLQkJbm9kZV9pZCA9IDA7Ci0JCXByb2NfcGlkID0gMDsKLQkJU2V0TGlzdChnTWFjaGluZUxpc3QpOwotCQkvKiBCeSBub3csIG9ubHkgMSBtYWNoaW5lIGlzIHN1cHBvcnRlZCAqLwotCQltID0gKHB0cF9tYWNoaW5lICopR2V0Rmlyc3RFbGVtZW50KGdNYWNoaW5lTGlzdCk7Ci0JCVNldExpc3QobS0+bm9kZXMpOwotCQluID0gKHB0cF9ub2RlICopR2V0TGlzdEVsZW1lbnQobS0+bm9kZXMpOwotCQlub2RlX2lkID0gbi0+aWQ7IC8qIG5vZGVfaWQgY2FsY3VsYXRlZCBieSBnZW5lcmF0ZWlkKCkgKi8KLQotCQlmb3IgKGkgPSAwOyBpIDwgam9iLT5udW1fcHJvY3M7IGkrKykgewotCQkJLyoKLQkJCSAqIFNMVVJNIHByb3ZpZGUgbm8gQVBJIHRvIGdldCBwaWQgLG5vZGVfaWQgYW5kIHRhc2tfaWQuCi0JCQkgKiBBbmQgdGhlc2UgaW5mb3JtYXRpb24gY2FuIG9idGFpbmVkIE9OTFkgYWZ0ZXIgam9iIGxhdW5jaGluZy4KLQkJCSAqIFNvIEZBS0UgdGhlbSBieSBub3cuIAotCQkJICogc2VuZE5ld1Byb2Nlc3NFdmVudCgpIHNob3VsZG4ndCBtYWtlIHVzZSBvZiB0aGVzZSBmaWxlZHMuCi0JCQkgKiBGSVhNRToKLQkJCSAqCWNhbGwgc2x1cm1fam9iX3N0ZXBfbGF5b3V0X2dldCgpIHRvIG9idGFpbiBzdWNoIGluZm9ybWF0aW9uCi0JCQkgKglhbmQgc2VuZCB0byB1aSB2aWEgc2VuZFByb2Nlc3NDaGFuZ2VFdmVudAkKLQkJCSAqLwotCQkJcCA9IG5ld19wcm9jZXNzKGpvYiwgbm9kZV9pZCwgdGFza19pZCwgcHJvY19waWQpOwotCQkJc2VuZE5ld1Byb2Nlc3NFdmVudChnVHJhbnNJRCwgam9iLT5wdHBfam9iaWQsIHAsIFBST0NfU1RBVEVfU1RBUlRJTkcpOwotCQkJdGFza19pZCArPSAxOwotCQkJcHJvY19waWQgKz0gMTsKLQkJIH0KLQotCQljbG9zZShmZF9vdXRbMV0pOwotCQljbG9zZShmZF9lcnJbMV0pOwotCQlqb2ItPmZkX291dCA9IGZkX291dFswXTsKLQkJam9iLT5mZF9lcnIgPSBmZF9lcnJbMF07Ci0KLQkJLyogCi0JCSAqIENyZWF0ZSBpbyB0aHJlYWQgdG8gbWFuYWdlIHNydW4ncyBzdGRlcnIgYW5kIHN0ZG91dCAKLQkgICAgICogRG9uJ3Qgc3RhcnQgaXQgYmVmb3JlIHNlbmRpbmcgdGhlIE5ld1Byb2Nlc3MgZXZlbnRzIQotCSAgICAgKi8KLQkJaWYgKGNyZWF0ZV9pb3RocmVhZChqb2IpID09IDApIHsKLQkJCXBwLT5pb19yZWFkeSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlwcC0+aW9fcmVhZHkgPSBmYWxzZTsKLQkJCWpvYi0+aW90aHJlYWRfZXhpdCA9IHRydWU7Ci0JCX0KLQkJc2htZHQocHApOwotCQlzaG1jdGwoc2htaWQsIElQQ19STUlELCAwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZWFyY2ggJENXRCBhbmQgJFBBVEggZGlyIGFuZCByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgY21kLiAKLSAqLwotc3RhdGljIGNoYXIgKgotZ2V0X3BhdGgoY2hhciAqIGNtZCwgY2hhciAqIGN3ZCwgaW50IG1vZGUpCi17Ci0JY2hhciAqIHBhdGggPSBOVUxMOwotCWNoYXIgKiBmdWxscGF0aCA9IE5VTEw7Ci0JY2hhciAqIGM7Ci0JY2hhciAqIHB0cjsKLQotCWlmICggKGNtZFswXSA9PSAnLicgfHwgY21kWzBdID09ICcvJykKLQkJJiYgYWNjZXNzKGNtZCwgbW9kZSkgPT0gMCkgewotCQlpZiAoY21kWzBdID09ICcuJykgCi0JCQlhc3ByaW50ZigmZnVsbHBhdGgsIiVzLyVzIixjd2QsY21kKTsKLQkJZWxzZSAKLQkJCWFzcHJpbnRmKCZmdWxscGF0aCxjbWQpOwotCX0gZWxzZSB7Ci0JCS8qIHNlYXJjaCAkUEFUSCAqLwotCQlwYXRoID0gZ2V0ZW52KCJQQVRIIik7Ci0JCWlmIChwYXRoICE9IE5VTEwpIHsKLQkJCWMgPSBwdHIgPSBwYXRoOwotCQkJd2hpbGUoKGM9c3RyY2hyKHB0ciwnOicpKSAhPSBOVUxMKSB7Ci0JCQkJKmMgPSAnXDAnOwotCQkJCWFzcHJpbnRmKCZmdWxscGF0aCwgIiVzLyVzIixwdHIsY21kKTsKLQkJCQlpZiAoYWNjZXNzKGZ1bGxwYXRoLCBtb2RlKSA9PSAwKQotCQkJCQlicmVhazsKLQkJCQllbHNlIHsKLQkJCQkJZnJlZShmdWxscGF0aCk7Ci0JCQkJCWZ1bGxwYXRoID0gTlVMTDsKLQkJCQkJcHRyID0gYyArIDE7Ci0JCQkJfQkKLQkJCX0KLQkJCS8qIGhhbmRsZSB0aGUgbGFzdCBlbGVtZW50ICovCi0JCQlpZiAoKnB0ciAhPSAnXDAnKSB7Ci0JCQkJYXNwcmludGYoJmZ1bGxwYXRoLCAiJXMvJXMiLHB0cixjbWQpOwotCQkJCWlmIChhY2Nlc3MoZnVsbHBhdGgsIG1vZGUpICE9IDApIHsKLQkJCQkJZnJlZShmdWxscGF0aCk7Ci0JCQkJCWZ1bGxwYXRoID0gTlVMTDsKLQkJCQl9CQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBmdWxscGF0aDsKLX0KLQotc3NpemVfdCBmZF9yZWFkX2xpbmUoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBtYXhsZW4pCi17Ci0gICAgc3NpemVfdCBuLCByYzsKLSAgICB1bnNpZ25lZCBjaGFyIGMsICpwOwotCi0gICAgbiA9IDA7Ci0gICAgcCA9IGJ1ZjsKLSAgICB3aGlsZSAobiA8IG1heGxlbiAtIDEpIHsgICAvKiByZXNlcnZlIHNwYWNlIGZvciBOVUwtdGVybWluYXRpb24gKi8KLQkJaWYgKChyYyA9IHJlYWQoZmQsICZjLCAxKSkgPT0gMSkgewotCQkJbisrOwotCQkJKnArKyA9IGM7Ci0JCQlpZiAoYyA9PSAnXG4nKQotCQkJCWJyZWFrOyAgICAgICAgIC8qIHN0b3JlIG5ld2xpbmUsIGxpa2UgZmdldHMoKSAqLwotCQl9ZWxzZSBpZiAocmMgPT0gMCkgewotCQkJaWYgKG4gPT0gMCkgICAgICAgIC8qIEVPRiwgbm8gZGF0YSByZWFkICovCi0JCQkJcmV0dXJuKDApOwotCQkJZWxzZSAgICAgICAgICAgICAgIC8qIEVPRiwgc29tZSBkYXRhIHJlYWQgKi8KLQkJCQlicmVhazsKLQkJfWVsc2UgewotCQkJaWYgKGVycm5vID09IEVJTlRSKQotCQkJCWNvbnRpbnVlOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLQotCSpwID0gJ1wwJzsgIC8qIE5VTEwtdGVybWluYXRlLCBsaWtlIGZnZXRzKCkgKi8KLQlyZXR1cm4obik7Ci19Ci0KLS8qCi0gKiBGb3J3YXJkaW5nIHNydW4ncyBzdGRvdXQgdG8gcHRwIHVpCi0gKiBGSVhNRToKLSAqIAkJSG93IGFib3V0IHNydW4ncyBzdGRlcnI/IEJ5IG5vdywgaXQncyBpZ25vcmVkLgotICovCi12b2lkICoKLXNydW5fb3V0cHV0X2ZvcndhcmRpbmcodm9pZCAqIGFyZykKLXsKLQlpbnQgZmQgPSAtMTsKLQljaGFyICogcHRyOwotCXB0cF9qb2IgKiBqb2I7Ci0JaW50IHRhc2tfaWQ7Ci0JZmRfc2V0IHJmZHM7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JY2hhciBidWZbTUFYX0JVRl9TSVpFXTsKLQlGSUxFICogZnAgPSBOVUxMOwotCWludCBjYW5jZWxfc3RhdGU7Ci0JaW50IGNhbmNlbF90eXBlOwotCWludAlyZXQ7Ci0JY2hhciAqIHA7Ci0JcGlkX3QgY3BpZDsKLQlpbnQgc3RhdHVzOwotCQotCXB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCZjYW5jZWxfc3RhdGUpOwotCXB0aHJlYWRfc2V0Y2FuY2VsdHlwZShQVEhSRUFEX0NBTkNFTF9ERUZFUlJFRCwgJmNhbmNlbF90eXBlKTsKLQkKLQlqb2IgPSAocHRwX2pvYiAqKWFyZzsKLQlqb2ItPmlvdGhyZWFkX2V4aXQgPSBmYWxzZTsKLQkvKiBCeSBub3cgb25seSBmb2N1cyBvbiBqb2Igc3Rkb3V0ICovCi0JZmQgPSBqb2ItPmZkX291dDsKLQkKLQl3aGlsZSAoMSkKLQl7Ci0JCWlmIChqb2ItPmlvdGhyZWFkX2V4aXRfcmVxKSB7Ci0JCQlkZWJ1Z19sb2cobG9nZnAsICJqb2JbJWRdIGlvdGhyZWFkIGV4aXQgb24gZXhpdF9yZXF1ZXN0LlxuIiwgam9iLT5zbHVybV9qb2JpZCk7Ci0JCQlqb2ItPmlvdGhyZWFkX2V4aXQgPSB0cnVlOwotCQkJaWYgKGZwKQotCQkJCWZjbG9zZShmcCk7Ci0JCQlwdGhyZWFkX2V4aXQoTlVMTCk7Ci0JCX0KLQkJCi0JCXR2LnR2X3NlYyA9IDA7Ci0JCXR2LnR2X3VzZWMgPSA1MDAwOwotCQkKLQkJLyogCi0JCSAqIGlmIHRpbWVvdXQsIHRoZSByZmRzIHdpbGwgYmUgY2xlYXJlZCAKLQkJICogcmZkcyBtdXN0IGJlIHNldCBpbiBlYWNoIGl0ZXJhdGlvbgotCQkgKi8KLQkJRkRfWkVSTygmcmZkcyk7Ci0JCUZEX1NFVChmZCwgJnJmZHMpOwotCQlyZXQgPSBzZWxlY3QoZmQrMSwmcmZkcyxOVUxMLE5VTEwsJnR2KTsKLQotCQlzd2l0Y2gocmV0KQotCQl7Ci0JCWNhc2UgLTE6IC8qIGVycm9yICovCi0JCQlkZWJ1Z19sb2cobG9nZnAsImpvYlslZF0gaW90aHJlYWQgZXhpdCBvbiBzZWxlY3QgZXJyb3JcbiIsam9iLT5zbHVybV9qb2JpZCk7Ci0JCQlpZiAoZnApCi0JCQkJZmNsb3NlKGZwKTsKLQkJCWpvYi0+aW90aHJlYWRfZXhpdCA9IHRydWU7Ci0JCQlwdGhyZWFkX2V4aXQoTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlIDA6IC8qIHRpbWVvdXQgKi8KLQkJCS8vZGVidWdfbG9nKGxvZ2ZwLCJzZWxlY3QgdGltZW91dFxuIik7Ci0JCQlicmVhazsKLQkJCQkKLQkJZGVmYXVsdDogLyogZmQgcmVhZHkgKi8KLQkJCWlmIChmcCA9PSBOVUxMKQotCQkJCWZwID0gZmRvcGVuKGZkLCJyIik7Ci0JCQlpZiAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApICE9IE5VTEwpIHsKLQkJCS8vaWYgKChyYyA9IGZkX3JlYWRfbGluZShmZCwgYnVmLCBzaXplb2YoYnVmKSkpPiAwICkgewotCQkJCXAgPSBidWY7Ci0JCQkJLyogZ2V0IHRhc2sgaWQgZnJvbSBzcnVuIGxhYmVsICovCi0JCQkJdGFza19pZCA9IGF0b2kocCk7Ci0JCQkJcHRyID0gc3RyY2hyKHAsICc6Jyk7Ci0JCQkJcHRyICsrOwotCQkJCWlmIChwdHIgIT0gTlVMTCkgewotCQkJCQkvL2RlYnVnX2xvZyhsb2dmcCwic2VuZCB0YXNrWyVkXSBvdXRwdXQgdG8gcHRwIHVpXG4iLCB0YXNrX2lkKTsKLQkJCQkJLyogCi0JCQkJCSAqIG5vIHN5bmNocm9uaXphdGlvbiBuZWVkZWQgCi0JCQkJCSAqIHNpbmNlIHRoZSBldmVudCBsaXN0IGlzIGludGVybmFsbHkgcHJvdGVjdGVkIGJ5IHB0aHJlYWRfbXV0ZXgKLQkJCQkJICovCi0JCQkJCXB0cF9wcm9jZXNzICogcHJvYzsKLQkJCQkJcHJvYyA9IGZpbmRfcHJvY2Vzcyhqb2IsIHRhc2tfaWQpOwotCQkJCQlzZW5kUHJvY2Vzc091dHB1dEV2ZW50KGdUcmFuc0lELCBwcm9jLT5pZCwgcHRyKTsKLQkJCQl9IGVsc2UgCi0JCQkJCWRlYnVnX2xvZyhsb2dmcCwicHJvY2VzcyBsYWJlbCBub3QgZm91bmRcbiIpOwotCQkJfSBlbHNlIHsgLyogZXJyb3Igb3IgRU9GIG9mIHBpcGUod3JpdGUgZW5kIGNsb3NlZCkgKi8KLQkJCQlkZWJ1Z19sb2cobG9nZnAsIkVPRiBvZiBwaXBlXG4iKTsKLQkJCQlpZiAoZnApCi0JCQkJCWZjbG9zZShmcCk7Ci0JCQkJam9iLT5pb3RocmVhZF9leGl0ID0gdHJ1ZTsKLQkJCQljcGlkID0gd2FpdHBpZChqb2ItPnNydW5fcGlkLCAmc3RhdHVzLCAwKTsKLQkJCQlpZiAoY3BpZCA9PSBqb2ItPnNydW5fcGlkKSB7Ci0JCQkJCWlmIChXSUZFWElURUQoc3RhdHVzKSkgewotCQkJCQkJaWYgKGpvYi0+bmVlZF9hbGxvYykKLQkJCQkJCQlzbHVybV9jb21wbGV0ZV9qb2Ioam9iLT5zbHVybV9qb2JpZCwgMCk7Ci0JCQkJCQlkZWJ1Z19sb2cobG9nZnAsICJzcnVuIGV4aXQgY29kZTolZFxuIiwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewotCQkJCQkJaWYgKGpvYi0+bmVlZF9hbGxvYykKLQkJCQkJCQlzbHVybV9raWxsX2pvYihqb2ItPnNsdXJtX2pvYmlkLCBTSUdLSUxMLCAwKTsKLQkJCQkJCWRlYnVnX2xvZyhsb2dmcCwgInNydW4gdGVybWluYXRlZCBieSBzaWduYWxbJWRdXG4iLCBXVEVSTVNJRyhzdGF0dXMpKTsKLQkJCQkJfQotCQkJCQlwdGhyZWFkX2V4aXQoTlVMTCk7Ci0JCQkJfQotCQkJfQkKLQkJCWJyZWFrOyAKLQkJfQkKLQl9CQkKLQkKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIERlbGV0ZSByZW1vdmFibGUgam9iIGZybyBnSm9iTGlzdC4KLSAqLwotc3RhdGljIHZvaWQgCi1wdXJnZV9nbG9iYWxfam9ibGlzdCgpCi17Ci0JcHRwX2pvYiAqIGo7Ci0JCi0JZm9yIChTZXRMaXN0KGdKb2JMaXN0KTsgKGogPSAocHRwX2pvYiAqKUdldExpc3RFbGVtZW50KGdKb2JMaXN0KSkgIT0gTlVMTDsgKSB7Ci0JCWlmIChqLT5pb3RocmVhZF9leGl0ICYmICFzbHVybV9qb2JfYWN0aXZlKGopKQotCQkJai0+cmVtb3ZhYmxlID0gdHJ1ZTsKLQkJaWYgKGotPnJlbW92YWJsZSkgewotCQkJUmVtb3ZlRnJvbUxpc3QoZ0pvYkxpc3QsIGopOwotCQkJZnJlZV9qb2Ioaik7Ci0JCX0JCi0JfQotCXJldHVybjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTVEFSVCBPRiBESVNQQVRDSCBST1VUSU5FUyAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQKLVNMVVJNX0luaXRpYWxpemUoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJaTsKLQlpbnQgCXByaW1hcnkgPSAxOwotCWludCAJc2Vjb25kYXJ5ID0gMjsKLQlsb25nCXZlcnNpb247Ci0JCi0JZGVidWdfbG9nKGxvZ2ZwLCAiU0xVUk1fSW5pdGlhbGl6ZSAoJWQpOlxuIiwgdHJhbnNfaWQpOwotCQotCWlmIChwcm94eV9zdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX1NMVVJNX0lOSVQsICJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCWlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShQUk9UT0NPTF9WRVJTSU9OX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlpZiAoc3RyY21wKHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pLCBXSVJFX1BST1RPQ09MX1ZFUlNJT04pICE9IDApIHsKLQkJCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TTFVSTV9JTklULCAiV2lyZSBwcm90b2NvbCB2ZXJzaW9uIFwiJXNcIiBub3Qgc3VwcG9ydGVkIiwgYXJnc1swXSk7Ci0JCQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShCQVNFX0lEX0FUVFIsIGFyZ3NbaV0pKSAKLQkJCWdCYXNlSUQgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2ludChhcmdzW2ldKTsKLQl9Ci0KLQlpZiAoZ0Jhc2VJRCA8IDApIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfU0xVUk1fSU5JVCwgIk5vIGJhc2UgSUQgc3VwcGxpZWQiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0JCi0gCS8qIGNvbmZpcm0gc2x1cm1jdGxkIHdvcmtzIHdlbGwgdmlhIHNsdXJtX3BpbmcgKi8gCi0JaWYgKHNsdXJtX3BpbmcocHJpbWFyeSkgJiYgc2x1cm1fcGluZyhzZWNvbmRhcnkpKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX1NMVVJNX0lOSVQsICJObyByZXNwb25zZSBmcm9tIHNsdXJtY3RsZC4gQ2hlY2sgU0xVUk0gUk1TISIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0JCi0gIAkvKiAKLQkgKiBTTFVSTSB2ZXJzaW9uIHZlcmZpY2F0aW9uLAotCSAqIFNob3VsZCB3b3JrIG9uIG1vcmUgdmVyc2lvbnMgc3VwcG9ydGluZyB1c2VkIEFQSS4gCi0JICovCi0JIHZlcnNpb24gPSBzbHVybV9hcGlfdmVyc2lvbigpOwotCSBpZiAodmVyc2lvbiA8IFNMVVJNX1ZFUlNJT05fTlVNKDEsMyw0KSkgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TTFVSTV9JTklULCAiU0xVUk0gdmVyc2lvbiBudW1iZXIgdG9vIGxvdyIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCSB9Ci0KLQlwcm94eV9zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7Ci0Jc2VuZE9LRXZlbnQodHJhbnNfaWQpOwotCQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qCi0gKiBJbml0IHRoZSBtb2RlbCBkZWZpbml0aW9uIHBoYXNlLgotICovCi1pbnQKLVNMVVJNX01vZGVsRGVmKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlkZWJ1Z19sb2cobG9nZnAsICJTTFVSTV9Nb2RlbERlZiAoJWQpOlxuIiwgdHJhbnNfaWQpOyAKLQkKLQlzZW5kT0tFdmVudCh0cmFuc19pZCk7Ci0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotaW50Ci1TTFVSTV9TdG9wRXZlbnRzKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlkZWJ1Z19sb2cobG9nZnAsICJTTFVSTV9TdG9wRXZlbnRzICglZCk6XG4iLCB0cmFuc19pZCk7IAotCi0JLyogTm90aWZ5IHRoYXQgdGFydEV2ZW50cyBjb21wbGV0ZSAqLwotCXNlbmRPS0V2ZW50KGdUcmFuc0lEKTsKLQlnVHJhbnNJRCA9IDA7Ci0Jc2VuZE9LRXZlbnQodHJhbnNfaWQpOwotCXJldHVybiBQUk9YWV9SRVNfT0s7CQotfQotCi0KLS8qCi0gKiBTdWJtaXQgYSBqb2Igd2l0aCB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSBwYXRoIGFuZCBhcmd1bWVudHMuIAotICogKDEpUHJvY2VzcyBjbWQgYXJndW1lbnRzOwotICogKDIpRGlzdGluZ3Vpc2ggYmV0d2VlbiBkZWJ1ZyBqb2IgYW5kIG5vbi1kZWJ1ZyBqb2I7Ci0gKiAoMylBbGxvY2F0ZSByZXNvdXJjZSBhbmQgc3Bhd24gam9iIHN0ZXAuCi0gKi8KLWludAotU0xVUk1fU3VibWl0Sm9iKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCWksazsKLQlpbnQJCW51bV9hcmdzID0gMDsKLQlpbnQJCW51bV9lbnYgPSAwOwotCWNoYXIgKglqb2JzdWJpZCA9IE5VTEw7IC8qIGpvYmlkIGFzc2lnbmVkIGJ5IFJNUyh1aSkgKi8KLQkKLQkvKiBzcnVuIG9wdGlvbnM6IC1uLCAtTiwgLXQsIC1wLCAtbCwgLXYsIC0tam9iaWQsIC13LCAteCwgLS1qb2JfdHlwZSAqLwotCWludAkJbnVtX3Byb2NzID0gMDsgLyogLW46IG51bWJlciBvZiB0YXNrcyB0byBydW4qLwotCWludAkJbnVtX25vZGVzID0gMDsgLyogLU46IG51bWJlciBvZiBub2RlcyBvbiB3aGljaCB0byBydW4gKE49bWluWy1tYXhdKSAqLwotCWludAkJdGxpbWl0ID0gLTE7ICAgLyogLXQ6IHRpbWUgbGltaXQgKi8JCQotCWJvb2wgCXRsaW1pdF9zZXQgPSBmYWxzZTsKLQljaGFyICogCXBhcnRpdGlvbiA9IE5VTEw7IC8qIC1wOiBwYXJ0aXRpb24gcmVxdWVzdGVkICovCi0JYm9vbAlwYXJ0aXRpb25fc2V0ID0gZmFsc2U7Ci0JYm9vbAlpb19sYWJlbCA9IGZhbHNlOyAvKiAtbDogcHJlcGVuZCB0YXNrIG51bWJlciB0byBsaW5lcyBvZiBzdGRvdXQvZXJyICovCi0JYm9vbCAJaW9fbGFiZWxfc2V0ID0gZmFsc2U7Ci0JYm9vbCAJdmVyYm9zZSA9IGZhbHNlOwkvKiAtdjp2ZXJib3NlIG1vZGUgKi8KLQlib29sCXZlcmJvc2Vfc2V0ID0gZmFsc2U7Ci0JY2hhciAqIAlub2RlX2xpc3Q9TlVMTDsJLyogLXc6IHJlcXVlc3QgYSBzcGVjaWZpYyBsaXN0IG9mIGhvc3RzICovCi0JYm9vbAlub2RlbGlzdF9zZXQgPSBmYWxzZTsKLQlpbnQJCWFsbG9jYXRlZF9qb2JpZDsgLyogLS1qb2JpZDogcnVuIHVuZGVyIGFscmVhZHkgYWxsb2NhdGVkIGpvYiAqLwotCWJvb2wJam9iaWRfc2V0ID0gZmFsc2U7Ci0JY2hhciAqIAlqb2J0eXBlID0gTlVMTDsJLyogLS1qb2JfdHlwZTptcGksb21wLHNlcmlhbCAqLwotCWJvb2wJam9idHlwZV9zZXQgPSBmYWxzZTsKLQotCWNoYXIgKglmdWxsX3BhdGggPSBOVUxMOwotCWNoYXIgKgljd2QgPSBOVUxMOwotCWNoYXIgKglleGVjX3BhdGggPSBOVUxMOyAvKiBQQVRIIG9mIGV4ZWN1dGFibGUgKi8KLQljaGFyICoJcGdtX25hbWUgPSBOVUxMOyAKLQkKLQkvKiBkZWJ1ZyBqb2Igc3VwcG9ydCAqLyAKLQlib29sCWRlYnVnID0gZmFsc2U7Ci0JaW50CQlkZWJ1Z19hcmdjID0gMDsKLQlpbnQJCWF0dGFjaF9tb2RlOwotCWNoYXIgKglkZWJ1Z19leGVjX25hbWUgPSBOVUxMOwotCWNoYXIgKglkZWJ1Z19leGVjX3BhdGggPSBOVUxMOwotCWNoYXIgKglkZWJ1Z19mdWxsX3BhdGg7Ci0JY2hhciAqKglkZWJ1Z19hcmdzID0gTlVMTDsKLQotCWludAkJc3J1bl9hcmdjID0gMDsKLQljaGFyICoqIHNydW5fYXJndiA9IE5VTEw7Ci0JaW50IAlyZXQ7Ci0JaW50CQlwdHBpZCA9IGdlbmVyYXRlX2lkKCk7Ci0KLQlkZWJ1Z19sb2cobG9nZnAsICJTTFVSTV9TdWJtaXRKb2IgKCVkKTpcbiIsIHRyYW5zX2lkKTsKLQkvKiBQcm9jZXNzIGpvYiBzdWJtaXQgYXJncyAgKi8KLQlkZWJ1Z19sb2cobG9nZnAsICJqb2Igc3VibWl0IGNvbW1hbmRzOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCAiXHQlc1xuIiwgYXJnc1tpXSk7Ci0JCWlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfU1VCX0lEX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlqb2JzdWJpZCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9OVU1fUFJPQ1NfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCW51bV9wcm9jcyA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfaW50KGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9OVU1fTk9ERVNfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCW51bV9ub2RlcyA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfaW50KGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9USU1FX0xJTUlUX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQl0bGltaXRfc2V0ID0gdHJ1ZTsKLQkJCXRsaW1pdCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfaW50KGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9QQVJUSVRJT05fQVRUUiwgYXJnc1tpXSkpIHsKLQkJCXBhcnRpdGlvbl9zZXQgPSB0cnVlOwotCQkJcGFydGl0aW9uID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX0lPTEFCRUxfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWlvX2xhYmVsX3NldCA9IHRydWU7Ci0JCQlpb19sYWJlbCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfYm9vbChhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfVkVSQk9TRV9BVFRSLCBhcmdzW2ldKSkgewotCQkJdmVyYm9zZV9zZXQgPSB0cnVlOwotCQkJdmVyYm9zZSA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfYm9vbChhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfSURfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWpvYmlkX3NldCA9IHRydWU7Ci0JCQlhbGxvY2F0ZWRfam9iaWQgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2ludChhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfVFlQRV9BVFRSLCBhcmdzW2ldKSkgewotCQkJam9idHlwZV9zZXQgPSB0cnVlOwotCQkJam9idHlwZSA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9OT0RFTElTVF9BVFRSLCBhcmdzW2ldKSkgewotCQkJbm9kZWxpc3Rfc2V0ID0gdHJ1ZTsKLQkJCW5vZGVfbGlzdCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9FWEVDX05BTUVfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCXBnbV9uYW1lID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX0VYRUNfUEFUSF9BVFRSLCBhcmdzW2ldKSkgewotCQkJZXhlY19wYXRoID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX1dPUktJTkdfRElSX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQljd2QgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfUFJPR19BUkdTX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQludW1fYXJncysrOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9FTlZfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCW51bV9lbnYrKzsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfREVCVUdfQVJHU19BVFRSLCBhcmdzW2ldKSkgewotCQkJZGVidWdfYXJnYysrOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9ERUJVR19GTEFHX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlkZWJ1ZyA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfYm9vbChhcmdzW2ldKTsKLQkJfQotCX0KLQotCS8qIERvIHNvbWUgY2hlY2tpbmcgZmlyc3QgKi8KLQlpZiAoam9ic3ViaWQgPT0gTlVMTCkgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TTFVSTV9TVUJNSVQsICJtaXNzaW5nIElEIG9uIGpvYiBzdWJtaXNzaW9uIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCWlmIChwcm94eV9zdGF0ZSAhPSBTVEFURV9SVU5OSU5HKSB7Ci0JCXNlbmRKb2JTdWJFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JzdWJpZCwgIm11c3QgY2FsbCBJTklUIGZpcnN0Iik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCWlmIChuYXJncyA8IDEpIHsKLQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCAiaW5jb3JyZWN0IGFyZyBjb3VudCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQlpZiAocGdtX25hbWUgPT0gTlVMTCkgewotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsICJtdXN0IHNwZWNpZnkgYSBwcm9ncmFtIG5hbWUiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0JaWYgKG51bV9wcm9jcyA8PSAwKSB7Ci0JCXNlbmRKb2JTdWJFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JzdWJpZCwgIm11c3Qgc3BlY2lmeSBudW1iZXIgb2YgdGFzayB0byBsYXVuY2giKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0KLQkvKgotCSAqIFByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAKLQkgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgd2lsbCBiZSBicm91Z2h0IHRvIGNvbXB1dGUgbm9kZSAKLQkgKiBieSBTTFVSTSBiZWZvcmUgbGF1bmNoaW5nIGpvYi4gCi0JICovCi0JaWYgKG51bV9lbnYgPiAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCQlpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX0VOVl9BVFRSLCBhcmdzW2ldKSkKLQkJCQlwdXRlbnYocHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSkpOwotCQl9Ci0JfQotCS8qIGxvY2F0ZSBleGVjdWFibGUgKi8KLQlpZiAoZXhlY19wYXRoID09IE5VTEwpIHsKLQkJZnVsbF9wYXRoID0gZ2V0X3BhdGgocGdtX25hbWUsIGN3ZCwgWF9PSyk7Ci0JCWlmIChmdWxsX3BhdGggPT0gTlVMTCkgewotCQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCAiZXhlY3V0YWJsZSBub3QgZm91bmQiKTsKLQkJCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JCX0KLQl9IGVsc2UgCi0JCWFzcHJpbnRmKCZmdWxsX3BhdGgsICIlcy8lcyIsIGV4ZWNfcGF0aCwgcGdtX25hbWUpOwotCS8qIGNoZWNrIGFjY2VzcyByaWdodCAqLwkJCi0JaWYgKGFjY2VzcyhmdWxsX3BhdGgsIFhfT0spIDwgMCkgewotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWlmIChmdWxsX3BhdGggIT0gTlVMTCkKLQkJCWZyZWUoZnVsbF9wYXRoKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0JCi0JLyogYWxsb2NhdGUgc3BhY2UgZm9yIHNydW4gYXJncyAqLwotCXNydW5fYXJndiA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSpNQVhfU1JVTl9BUkdfTlVNKTsKLQlpZiAoc3J1bl9hcmd2ID09IE5VTEwpIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCAibWVtb3J5IGFsbG9jYXRpb24gZm9yIHNydW5fYXJndiBmYWlsIik7Ci0JCXNlbmRKb2JTdWJFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JzdWJpZCwgIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBzcnVuX2FyZ3MgZmFpbCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQotCS8qCi0JICpGSVhNRTogbW9yZSBkZWJ1ZyBqb2Igc3VwcG9ydCB3aWxsIGJlIGFkZGVkIHNvb24uCi0JICovCi0JLyoqKioqKioqKioqKioqKipoYW5kbGUgZGVidWcgam9iKioqKioqKioqKioqKioqKiovCi0JaWYgKGRlYnVnKSB7CQkKLQkJZGVidWdfYXJnYysrOwotCQlkZWJ1Z19hcmdzID0gKGNoYXIgKiopbWFsbG9jKChkZWJ1Z19hcmdjKzEpICogc2l6ZW9mKGNoYXIgKikpOwotCQlmb3IgKGkgPSAwLCBrID0gMTsgaSA8IG5hcmdzOyBpKyspIHsKLQkJCWlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfREVCVUdfQVJHU19BVFRSLCBhcmdzW2ldKSkgewotCQkJCWRlYnVnX2FyZ3NbaysrXSA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfREVCVUdfRVhFQ19OQU1FX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQkJZGVidWdfZXhlY19uYW1lID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9ERUJVR19FWEVDX1BBVEhfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCQlkZWJ1Z19leGVjX3BhdGggPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJCX0KLQkJfQotCQlkZWJ1Z19hcmdzW2tdID0gTlVMTDsKLQkJCi0JCS8qCi0JCSAqIElmIG5vIHBhdGggc3BlY2lmaWVkLCB0cnkgdG8gbG9jYXRlIGV4ZWN1YWJsZS4KLQkJICovCQkKLQkJaWYgKGRlYnVnX2V4ZWNfcGF0aCA9PSBOVUxMKSB7Ci0JCQlkZWJ1Z19mdWxsX3BhdGggPSBnZXRfcGF0aChkZWJ1Z19leGVjX25hbWUsIGN3ZCwgWF9PSyk7Ci0JCQlpZiAoZGVidWdfZnVsbF9wYXRoID09IE5VTEwpIHsKLQkJCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsICJEZWJ1Z2dlciBleGVjdXR1YWJsZSBub3QgZm91bmQiKTsKLQkJCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXNwcmludGYoJmRlYnVnX2Z1bGxfcGF0aCwgIiVzLyVzIiwgZGVidWdfZXhlY19wYXRoLCBkZWJ1Z19leGVjX25hbWUpOwotCQl9Ci0JCQotCQlpZiAoYWNjZXNzKGRlYnVnX2Z1bGxfcGF0aCwgWF9PSykgPCAwKSB7Ci0JCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlpZiAoZGVidWdfZnVsbF9wYXRoICE9IE5VTEwpCi0JCQkJZnJlZShkZWJ1Z19mdWxsX3BhdGgpOwotCQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkJfQotCi0JCWRlYnVnX2FyZ3NbMF0gPSBzdHJkdXAoZGVidWdfZnVsbF9wYXRoKTsKLQkJaWYgKGRlYnVnX2Z1bGxfcGF0aCAhPSBOVUxMKQotCQkJZnJlZShkZWJ1Z19mdWxsX3BhdGgpOwotCX0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCS8qIHNldCBkZWZhdWx0IHNydW4gb3B0aW9ucyAqLwotCXNldF9zcnVuX29wdGlvbnNfZGVmYXVsdHMoJm9wdCk7Ci0KLQkvKgotCSAqIGNoYW5nZSBzcnVuIG9wdGlvbnMgYmFzZWQgb24gU3VibWl0Sm9iIGNtZCBhcmdzCi0JICogYW5kIHByZXBhcmUgc3J1bl9hcmdjLHNydW5fYXJndgotCSAqLwotCWludCBpbmRleCA9IDA7Ci0Jc3J1bl9hcmd2W2luZGV4KytdID0gc3RyZHVwKCJzcnVuIik7Ci0KLQlpZiAobnVtX3Byb2NzID4gMCkgewotCQlvcHQucHNfbnByb2NzID0gbnVtX3Byb2NzOwotCQlvcHQucHNfbnByb2NzX3NldCA9IHRydWU7Ci0JCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICItLW50YXNrcz0lZCIsIG9wdC5wc19ucHJvY3MpOwotCQlpbmRleCArPSAxOwotCX0JCi0JaWYgKG51bV9ub2RlcyA+IDApIHsKLQkJb3B0LnBzX21pbl9ub2RlcyA9IG51bV9ub2RlczsKLQkJb3B0LnBzX25vZGVzX3NldCA9IHRydWU7Ci0JCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICItLW5vZGVzPSVkIiwgb3B0LnBzX21pbl9ub2Rlcyk7Ci0JCWluZGV4ICs9IDE7Ci0JfQotCWlmICh0bGltaXRfc2V0KSB7Ci0JCW9wdC5wc190aW1lX2xpbWl0ID0gdGxpbWl0OwotCQlhc3ByaW50ZigmKHNydW5fYXJndltpbmRleF0pLCAiLS10aW1lPSVkIiwgb3B0LnBzX3RpbWVfbGltaXQpOwotCQlpbmRleCArPSAxOwotCX0KLQlpZiAocGFydGl0aW9uX3NldCkgewotCQlvcHQucHNfcGFydGl0aW9uID0gIHBhcnRpdGlvbjsKLQkJYXNwcmludGYoJihzcnVuX2FyZ3ZbaW5kZXhdKSwgIi0tcGFydGl0aW9uPSVzIiwgb3B0LnBzX3BhcnRpdGlvbik7Ci0JCWluZGV4ICs9IDE7Ci0JfQotCS8qIFRvIGRpc3Rpbmd1aXNoIHRhc2sgc3Rkb3V0LCB0aGlzIG9wdGlvbiBNVVNUIGJlIHNldCAqLwotCWlvX2xhYmVsX3NldCA9IHRydWU7Ci0JaWYgKGlvX2xhYmVsX3NldCkgeyAKLQkJb3B0LnBzX2xhYmVsaW8gPSBpb19sYWJlbDsKLQkJYXNwcmludGYoJihzcnVuX2FyZ3ZbaW5kZXhdKSwgIi0tbGFiZWwiKTsKLQkJaW5kZXggKz0gMTsKLQl9Ci0JaWYgKHZlcmJvc2Vfc2V0KSB7Ci0JCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICItLXZlcmJvc2UiKTsKLQkJaW5kZXggKz0gMTsKLQl9Ci0JaWYgKGpvYmlkX3NldCkgewotCQlvcHQucHNfam9iaWQgPSBhbGxvY2F0ZWRfam9iaWQ7Ci0JCW9wdC5wc19qb2JpZF9zZXQgPSB0cnVlOwotCQlhc3ByaW50ZigmKHNydW5fYXJndltpbmRleF0pLCAiLS1qb2JpZD0lZCIsIG9wdC5wc19qb2JpZCk7Ci0JCWluZGV4ICs9IDE7Ci0JfQotCQotCS8qaWYgKGpvYnR5cGVfc2V0KSB7Ci0JCW9wdC5wc19qb2J0eXBlID0gam9idHlwZTsKLSAgICAJYXNwcmludGYoJihzcnVuX2FyZ3ZbaW5kZXhdKSwgIi0tam9idHlwZT0lcyIsIG9wdC5wc19qb2J0eXBlKTsKLQkJaW5kZXggKz0gMTsKLQl9Ci0JKi8KLQlpZiAobm9kZWxpc3Rfc2V0KSB7Ci0JCW9wdC5wc19ub2RlbGlzdCA9IHN0cmR1cChub2RlX2xpc3QpOwotCQlvcHQucHNfbm9kZXNfc2V0ID0gdHJ1ZTsKLQkJYXNwcmludGYoJihzcnVuX2FyZ3ZbaW5kZXhdKSwgIi0tbm9kZWxpc3Q9JXMiLCBvcHQucHNfbm9kZWxpc3QpOwotCQlpbmRleCArPSAxOwotCX0KLQotCWlmIChjd2QpIHsKLQkJaWYgKG9wdC5wc19jd2QgIT0gTlVMTCkKLQkJCWZyZWUob3B0LnBzX2N3ZCk7Ci0JCW9wdC5wc19jd2QgPSBzdHJkdXAoY3dkKTsKLQkJb3B0LnBzX2N3ZF9zZXQgPSB0cnVlOwotCX0KLQotCW9wdC5wc19wcm9nbmFtZSA9IGZ1bGxfcGF0aDsKLQkvKiBzZXQgam9iIG5hbWUsb3RoZXJ3aXNlIGJlIE5VTEwgKi8KLQlvcHQucHNfam9iX25hbWUgPSBiYXNlbmFtZShmdWxsX3BhdGgpOwotCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICIlcyIsIG9wdC5wc19wcm9nbmFtZSk7Ci0JaW5kZXggKz0gMTsKLQkKLQkvKiBwcm9ncmFtIG5hbWUgZm9sbG93ZCBieSBhcmdzICovCi0JaWYgKG51bV9hcmdzID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgewotCQkJaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9QUk9HX0FSR1NfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCQlhc3ByaW50ZigmKHNydW5fYXJndltpbmRleF0pLCAiJXMiLCBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKSk7Ci0JCQkJaW5kZXggKz0gMTsKLQkJCX0JCi0JCX0KLQl9Ci0Jc3J1bl9hcmd2W2luZGV4XSA9IE5VTEw7IC8qIG1hcmsgdGhlIGVuZCBvZiBzcnVuX2FyZ3ZbXSAqLwotCi0Jc3J1bl9hcmdjID0gaW5kZXg7CQotCWRlYnVnX2xvZyhsb2dmcCwgInNydW4gY21kOiIpOwotCWZvciAoaSA9IDA7IGkgPCBzcnVuX2FyZ2M7IGkrKykgCi0JCWRlYnVnX2xvZyhsb2dmcCwiJXMgIixzcnVuX2FyZ3ZbaV0pOwotCWRlYnVnX2xvZyhsb2dmcCwgIlxuIik7Ci0KLQotCS8qCi0JICogRklYTUU6IEJ5IG5vdywgZGVidWcgam9iIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JaWYgKGRlYnVnKSB7Ci0JCWlmIChhdHRhY2hfbW9kZSkgewotCQkJcmV0ID0gIGhhbmRsZV9hdHRhY2hfZGVidWcoKTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IGhhbmRsZV9kZWJ1ZygpOwotCQl9CQotCX0gZWxzZSB7Ci0JCXB0cF9qb2IgajsKLQkJai5kZWJ1ZyA9IGRlYnVnOwotCQlqLnB0cF9qb2JpZCA9IHB0cGlkOyAvKiBtb2RlbCBlbGVtZW50IGlkIGdlbmVyYXRlZCBieSBwcm94eSBhZ2VudCAqLwotCQlqLm51bV9wcm9jcyA9IG51bV9wcm9jczsKLQkJYWxsb2NhdGVfYW5kX2xhdW5jaF9qb2IodHJhbnNfaWQsIGpvYnN1YmlkLCAmaiwgJm9wdCwgc3J1bl9hcmdjLCBzcnVuX2FyZ3YpOwotCQlmcmVlX29wdCgmb3B0KTsKLQkJZnJlZV9zcnVuX2FyZ3Yoc3J1bl9hcmdjLHNydW5fYXJndik7Ci0JfQotCi0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0JCQotCi0vKiAKLSAqIENhbmNlbCBqb2IsIGdpdmVuIHB0cCBqb2JpZCAobm90IHNsdXJtIGpvYmlkKS4KLSAqLwotaW50Ci1TTFVSTV9UZXJtaW5hdGVKb2IoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCWk7Ci0JaW50IAkJcHRwX2pvYmlkID0gLTE7Ci0JcHRwX2pvYiAqIAlqOwotCi0JCi0JaWYgKHByb3h5X3N0YXRlICE9IFNUQVRFX1JVTk5JTkcpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfSk9CLCAibXVzdCBjYWxsIElOSVQgZmlyc3QiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKLQkJaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9JRF9BVFRSLCBhcmdzW2ldKSkgewotCQkJcHRwX2pvYmlkID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9pbnQoYXJnc1tpXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChwdHBfam9iaWQgPCAwKSB7Ci0JCXNlbmRKb2JUZXJtaW5hdGVFcnJvckV2ZW50KHRyYW5zX2lkLCBwdHBfam9iaWQsICJpbnZhbGlkIGpvYmlkICIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQotCS8qIGNvbnZlcnQgcHRwIGpvYmlkIHRvIHNsdXJtIGpvYmlkICovCi0JaWYgKChqID0gZmluZF9qb2IocHRwX2pvYmlkLCBQVFBfSk9CSUQpKSAhPSBOVUxMKSB7Ci0JCS8qCi0JCSAqIEtpbGwgYWxsIGpvYiBzdGVwcyBhbmQgcmVxdWVzdCBpb3RocmVhZCB0byBleGl0LgotCQkgKiBSZW1vdmluZyBqb2Igc3RydWN0dXJlIGZyb20gdGhlIGdsb2JhbCBqb2IgbGlzdCAKLQkJICogaXMgbGVmdCB0byBwdXJnZV9nbG9iYWxfam9ibGlzdCgpLgotCQkgKi8KLQkJa2lsbChqLT5zcnVuX3BpZCwgU0lHS0lMTCk7Ci0JCWotPmlvdGhyZWFkX2V4aXRfcmVxID0gdHJ1ZTsKLQkJaWYgKGotPm5lZWRfYWxsb2MpIHsKLQkJCXNsdXJtX2tpbGxfam9iKGotPnNsdXJtX2pvYmlkLCBTSUdLSUxMLCAwKTsgCi0JCX0JCi0JfSAKLQlzZW5kT0tFdmVudCh0cmFuc19pZCk7Ci0KLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKgotICogRW5hYmxlIHNlbmRpbmcgb2YgZXZlbnRzLgotICogVGhlIGZpcnN0IG1zZyB0aGF0IG11c3QgYmUgc2VudCBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtb2RlbC4gCi0gKiBUaGlzIGNvbXByaXNlcyBORVcgbW9kZWwgZWxlbWVudCBldmVudHMKLSAqIChOZXdNYWNoaW5lLCBOZXdOb2RlLCBOZXdRdWV1ZSkgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbW9kZWwuIAotICogT25jZSB0aGUgbW9kZWwgZGVzY3JpcHRpb24gaGFzIGJlZW4gc2VudCwgbW9kZWwgY2hhbmdlIGV2ZW50cyB3aWxsIGJlIHNlbnQgYXMgZGV0ZWN0ZWQuCi0gKi8KLWludAotU0xVUk1fU3RhcnRFdmVudHMoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludCAJCQludW1fbWFjaGluZXM7Ci0JaW50CQkJCW07Ci0JcHRwX21hY2hpbmUgKgltYWNoOwotCWludAkJCQludW1fbm9kZXM7Ci0JCi0JZGVidWdfbG9nKGxvZ2ZwLCAiU0xVUk1fU3RhcnRFdmVudHMgKCVkKTpcbiIsIHRyYW5zX2lkKTsgCi0KLQlpZiAocHJveHlfc3RhdGUgIT0gU1RBVEVfUlVOTklORykgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TTFVSTV9JTklULCAiTXVzdCBjYWxsIElOSVQgZmlyc3QiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0KLQkvKiBOb2RlQ2hhbmdlLCBKb2JDaGFuZ2UgZXZlbnQgdXNlIGdUcmFuc0lEIGFzIFRJRCB0byBtYXRjaCBTVEFSVF9FVkVOVFMgY21kICovCi0JZ1RyYW5zSUQgPSB0cmFuc19pZDsKLQkKLQkvKgotCSAqIEZJWE1FOiBob3cgdG8gaGFuZGxlIHBhcnRpdGlvbiBpbmZvcm1hdGlvbiBpbiBTTFVSTT8KLQkgKi8KLQludW1fbWFjaGluZXMgPSBnZXRfbnVtX21hY2hpbmVzKCk7Ci0JZm9yKG0gPSAwOyBtIDwgbnVtX21hY2hpbmVzOyBtKyspIHsKLQkJbWFjaCA9IG5ld19tYWNoaW5lKCk7Ci0JCS8qIE5ld01hY2hpbmUgZWxlbWVudCAqLwotCQlzZW5kTmV3TWFjaGluZUV2ZW50KHRyYW5zX2lkLCBtYWNoLT5pZCwgZ2V0X21hY2hpbmVfbmFtZShtKSk7Ci0JCW51bV9ub2RlcyA9IGdldF9udW1fbm9kZXMobWFjaC0+aWQpOwotCQlpZihjcmVhdGVfbm9kZV9saXN0KG1hY2gpKSB7Ci0JCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9OQVRUUiwgIkZhaWwgdG8gY3JlYXRlIG5vZGVsaXN0Iik7Ci0JCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCQl9Ci0JCS8qIE5ld05vZGUgZWxlbWVudCAqLwotCQlzZW5kTmV3Tm9kZUV2ZW50KHRyYW5zX2lkLCBtYWNoLT5pZCwgbWFjaCk7Ci0JfQotCS8qIE5ld1F1ZXVlIGVsZW1lbnQgKi8KLQlzZW5kTmV3UXVldWVFdmVudCh0cmFuc19pZCk7Ci0KLQkvKiBGcm9tIG5vdyBvbiwgam9iIHN0YXRlIGFuZCBub2RlIHN0YXRlIHVwZGF0ZSBtc2cgY2FuIGJlIHNlbnQgKi8KLQllbmFibGVfc3RhdGVfdXBkYXRlID0gdHJ1ZTsKLQkKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0KLS8qCi0gKiBDb21waXRhYmxlIGludGVyZmFjZS4KLSAqIFByb3h5IG5vdCBhbGxvd2VkIHRvIHN0b3AgU0xVUk0gcm1zLgotICovCi1pbnQKLVNMVVJNX1F1aXQoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludCBvbGRfc3RhdGUgPSBwcm94eV9zdGF0ZTsKLQkKLQlkZWJ1Z19sb2cobG9nZnAsICJTTFVSTV9RdWl0IGNhbGxlZFxuIik7Ci0JCi0JcHJveHlfc3RhdGUgPSBTVEFURV9TSFVUVElOR19ET1dOOwotCWlmIChvbGRfc3RhdGUgPT0gU1RBVEVfUlVOTklORykgCi0JCWRvX3NsdXJtX3NodXRkb3duKCk7Ci0JCi0Jc2VuZFNodXRkb3duRXZlbnQodHJhbnNfaWQpOwotCQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVORCBPRiBESVNQQVRDSCBST1VUSU5FUyAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogSW5pdCBqb2JzdGF0ZV91cGRhdGVfdGltZXIuCi0gKi8KLXN0YXRpYyB2b2lkIAotaW5pdF9qb2JfdGltZXIoKQotewotCWdldHRpbWVvZmRheSgmam9iX3VwZGF0ZV90aW1lciwgTlVMTCk7Ci0JcmV0dXJuOwotfQotCi0vKgotICogSW5pdCBub2Rlc3RhdGVfdXBkYXRlX3RpbWVyLgotICovCi1zdGF0aWMgdm9pZCAKLWluaXRfbm9kZV90aW1lcigpCi17Ci0JZ2V0dGltZW9mZGF5KCZub2RlX3VwZGF0ZV90aW1lciwgTlVMTCk7Ci0JcmV0dXJuOwotfQotCi0vKgotICogQ2hlY2sgaWYgdGltZXIgZXhwaXJlcyBnaXZlbiB0aW1lb3V0IHZhbHVlLgotICovCi1zdGF0aWMgYm9vbAotdXBkYXRlX3RpbWVvdXQoaW50IHRpbWVyX2lkLCBjb25zdCBpbnQgdGltZW91dCkKLXsKLQlzdHJ1Y3QgdGltZXZhbCAqIHRpbWVyOwotCXN0cnVjdCB0aW1ldmFsIG5vdzsKLQlpbnQgdmFsOwotCWJvb2wgcmMgPSBmYWxzZTsKLQotCXN3aXRjaCAodGltZXJfaWQpIHsKLQljYXNlIEpPQl9VUERBVEVfVElNRVI6Ci0JCXRpbWVyID0gJmpvYl91cGRhdGVfdGltZXI7Ci0JCWJyZWFrOwotCWNhc2UgTk9ERV9VUERBVEVfVElNRVI6Ci0JCXRpbWVyID0gJm5vZGVfdXBkYXRlX3RpbWVyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7IAotCX0KLQlnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0JdmFsID0gKG5vdy50dl9zZWMgLSB0aW1lci0+dHZfc2VjKSAqIDEwMDAwMDAgKyAobm93LnR2X3VzZWMgLSB0aW1lci0+dHZfdXNlYykgLSB0aW1lb3V0OwotCWlmICh2YWwgPj0gMCkgewotCQkvKiB1cGRhdGUgdGltZXIgKi8KLQkJZ2V0dGltZW9mZGF5KHRpbWVyLCBOVUxMKTsKLQkJcmMgPSB0cnVlOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIFdyYXBwZXIgcm91dGluZSB0byBjaGVjayBqb2JfdXBkYXRlX3RpbWVyLgotICovCi1zdGF0aWMgYm9vbAotam9iX3VwZGF0ZV90aW1lb3V0KCkKLXsKLQlyZXR1cm4gdXBkYXRlX3RpbWVvdXQoSk9CX1VQREFURV9USU1FUiwgSk9CX1VQREFURV9USU1FT1VUKTsKLX0KLQotLyoKLSAqIFdyYXBwZXIgcm91dGluZSB0byBjaGVjayBub2RlX3VwZGF0ZV90aW1lci4KLSAqLwotc3RhdGljIGJvb2wKLW5vZGVfdXBkYXRlX3RpbWVvdXQoKQotewotCXJldHVybiB1cGRhdGVfdGltZW91dChOT0RFX1VQREFURV9USU1FUiwgTk9ERV9VUERBVEVfVElNRU9VVCk7Ci19Ci0KLS8qCi0gKiBVcGRhdGUgam9iL3Byb2Nlc3Mgc3RhdGUgYW5kIHNlbmQgc3RhdGUgQ0hBTkdFIHRvIHVpLgotICovCi1zdGF0aWMgdm9pZCAKLXVwZGF0ZV9qb2Jfc3RhdGUoaW50IHNsdXJtX2pvYmlkKQotewotCWludCBpOwotCWludCBlcnJjb2RlOwotCWJvb2wgam9iX2ZpbmQ7Ci0JcHRwX2pvYiAqIGo7Ci0Jam9iX2luZm9fbXNnX3QgKiBtc2cgPSBOVUxMOwotCi0JZXJyY29kZSA9IHNsdXJtX2xvYWRfam9icygodGltZV90KU5VTEwsICZtc2csIFNIT1dfQUxMKTsKLQlpZiAoZXJyY29kZSkgewotCQlkZWJ1Z19sb2cobG9nZnAsInNsdXJtX2xvYWRfam9icyBlcnJvciIpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChTZXRMaXN0KGdKb2JMaXN0KTsgKGogPSAocHRwX2pvYiAqKUdldExpc3RFbGVtZW50KGdKb2JMaXN0KSkgIT0gTlVMTDspIHsKLQkJaWYgKHNsdXJtX2pvYmlkID4gLTEpIHsgCi0JCQlpZiAoai0+c2x1cm1fam9iaWQgIT0gc2x1cm1fam9iaWQpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJam9iX2ZpbmQgPSBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IG1zZy0+cmVjb3JkX2NvdW50OyBpKyspIHsKLQkJCWlmIChqLT5zbHVybV9qb2JpZCA9PSAobXNnLT5qb2JfYXJyYXlbaV0pLmpvYl9pZCkgewotCQkJCWpvYl9maW5kID0gdHJ1ZTsKLQkJCQlpZiAoai0+c3RhdGUgIT0gKG1zZy0+am9iX2FycmF5W2ldKS5qb2Jfc3RhdGUpIHsgLypzdGF0ZSBjaGFuZ2UqLwotCQkJCQlqLT5zdGF0ZSA9IChtc2ctPmpvYl9hcnJheVtpXSkuam9iX3N0YXRlOwotCQkJCQkvKiAKLQkJCQkJICogU0xVUk0gZG9lc24ndCBwcm92aWRlIHByb2Nlc3Mgc3RhdGUuCi0JCQkJCSAqIEZvcmNlIHByb2Nlc3Mgc3RhdGUgY2hhbmdzIHdpdGggam9iIHN0YXRlLiAKLQkJCQkJICovCi0JCQkJCXNlbmRQcm9jZXNzU3RhdGVDaGFuZ2VFdmVudChnVHJhbnNJRCwgaiwgam9ic3RhdGVfdG9fc3RyaW5nKGotPnN0YXRlKSk7Ci0JCQkJCXNlbmRKb2JTdGF0ZUNoYW5nZUV2ZW50KGdUcmFuc0lELCBqLT5wdHBfam9iaWQsIGpvYnN0YXRlX3RvX3N0cmluZyhqLT5zdGF0ZSkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0JCi0JCX0KLQkJaWYgKCFqb2JfZmluZCkgeyAKLQkJCS8qCi0JCQkgKiBqb2Igbm90IGZvdW5kKHJhcmVseSBoYXBwZW5zKS4KLQkJCSAqIEluIHRoaXMgY2FzZSwgc2ltcGx5IG1hcmsgdGhpcyBqb2IgcmVtb3ZhYmxlLgotCQkJICogU0xVUk0ga2VlcCB0aGUgaW5mb3JtYXRpbiBvZiBjb21wbGV0ZS9mYWlsIGpvYnMgZm9yIE1pbkpvYkFnZSAoZGVmYXVsdCB0byAzMDApIHNlY29uZHMKLQkJCSAqIE1pbkpvYkFnZSBjYW4gYmUgc2V0IGluIHNsdXJtL2V0Yy9zbHVybS5jb25mLgotCQkJICovCi0JCQlqLT5yZW1vdmFibGUgPSB0cnVlOwotCQl9Ci0JCWlmIChzbHVybV9qb2JpZCA+IC0xKQotCQkJYnJlYWs7Ci0JfQotCXNsdXJtX2ZyZWVfam9iX2luZm9fbXNnKG1zZyk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0gKiBVcGRhdGUgQUxMIG5vZGVzIHN0YXRlIGFuZCBzZW5kIHN0YXRlIENIQU5HRSB0byB1aS4KLSAqLwotdm9pZAotdXBkYXRlX25vZGVfc3RhdGUoKQotewotCWludCBpOwotCXB0cF9ub2RlICogbm9kZTsKLQlpbnQgZXJyY29kZTsKLQlub2RlX2luZm9fbXNnX3QgKiBtc2c7Ci0JcmFuZ2VzZXQgKiB1bmtub3duX3NldCA9IG5ld19yYW5nZXNldCgpOwotCXJhbmdlc2V0ICogaWRsZV9zZXQgPSBuZXdfcmFuZ2VzZXQoKTsKLQlyYW5nZXNldCAqIGRvd25fc2V0ID0gbmV3X3Jhbmdlc2V0KCk7Ci0JcmFuZ2VzZXQgKiBhbGxvY2F0ZWRfc2V0ID0gbmV3X3Jhbmdlc2V0KCk7Ci0KLQlpZiAodW5rbm93bl9zZXQgPT0gTlVMTCB8fCBpZGxlX3NldCA9PSBOVUxMIHx8IGRvd25fc2V0ID09IE5VTEwgfHwgYWxsb2NhdGVkX3NldCA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7Ci0KLQllcnJjb2RlID0gc2x1cm1fbG9hZF9ub2RlKCh0aW1lX3QpTlVMTCwgJm1zZywgU0hPV19BTEwpOwotCWlmIChlcnJjb2RlKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwic2x1cm1fbG9hZF9ub2RlIGVycm9yLlxuIik7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgbXNnLT5yZWNvcmRfY291bnQ7IGkrKykgewotCQkJbm9kZSA9IGZpbmRfbm9kZV9ieV9uYW1lKG1zZy0+bm9kZV9hcnJheVtpXS5uYW1lKTsKLQkJCWlmIChub2RlLT5zdGF0ZSA9PSBtc2ctPm5vZGVfYXJyYXlbaV0ubm9kZV9zdGF0ZSkKLQkJCQljb250aW51ZTsKLQkJCWVsc2UgeyAvKiBub2RlIHN0YXRlIGNoYW5nZSAqLwotCQkJCW5vZGUtPnN0YXRlID0gbXNnLT5ub2RlX2FycmF5W2ldLm5vZGVfc3RhdGU7Ci0JCQkJc3dpdGNoIChtc2ctPm5vZGVfYXJyYXlbaV0ubm9kZV9zdGF0ZSAmIE5PREVfU1RBVEVfQkFTRSkgewotCQkJCWNhc2UgTk9ERV9TVEFURV9VTktOT1dOOgotCQkJCQlpbnNlcnRfaW5fcmFuZ2VzZXQodW5rbm93bl9zZXQsbm9kZS0+aWQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5PREVfU1RBVEVfRE9XTjoKLQkJCQkJaW5zZXJ0X2luX3Jhbmdlc2V0KGRvd25fc2V0LG5vZGUtPmlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOT0RFX1NUQVRFX0lETEU6Ci0JCQkJCWluc2VydF9pbl9yYW5nZXNldChpZGxlX3NldCxub2RlLT5pZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTk9ERV9TVEFURV9BTExPQ0FURUQ6Ci0JCQkJCWluc2VydF9pbl9yYW5nZXNldChhbGxvY2F0ZWRfc2V0LG5vZGUtPmlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZGVidWdfbG9nKGxvZ2ZwLCAidW5yZWNvZ25pemVkIG5vZGUgc3RhdGVcbiIpOwotCQkJCQlicmVhazsKLQkJCQl9CQotCQkJfQotCQl9CQotCQkJCi0JCWlmICghRW1wdHlMaXN0KHVua25vd25fc2V0LT5lbGVtZW50cykpIHsKLQkJCXNlbmROb2RlQ2hhbmdlRXZlbnQoZ1RyYW5zSUQscmFuZ2VzZXRfdG9fc3RyaW5nKHVua25vd25fc2V0KSxub2Rlc3RhdGVfdG9fc3RyaW5nKE5PREVfU1RBVEVfVU5LTk9XTikpOwotCQl9Ci0JCWlmICghRW1wdHlMaXN0KGRvd25fc2V0LT5lbGVtZW50cykpIHsKLQkJCXNlbmROb2RlQ2hhbmdlRXZlbnQoZ1RyYW5zSUQscmFuZ2VzZXRfdG9fc3RyaW5nKGRvd25fc2V0KSxub2Rlc3RhdGVfdG9fc3RyaW5nKE5PREVfU1RBVEVfRE9XTikpOwotCQl9Ci0JCWlmICghRW1wdHlMaXN0KGlkbGVfc2V0LT5lbGVtZW50cykpIHsKLQkJCXNlbmROb2RlQ2hhbmdlRXZlbnQoZ1RyYW5zSUQscmFuZ2VzZXRfdG9fc3RyaW5nKGlkbGVfc2V0KSxub2Rlc3RhdGVfdG9fc3RyaW5nKE5PREVfU1RBVEVfSURMRSkpOwotCQl9Ci0JCWlmICghRW1wdHlMaXN0KGFsbG9jYXRlZF9zZXQtPmVsZW1lbnRzKSkgewotCQkJc2VuZE5vZGVDaGFuZ2VFdmVudChnVHJhbnNJRCxyYW5nZXNldF90b19zdHJpbmcoYWxsb2NhdGVkX3NldCksbm9kZXN0YXRlX3RvX3N0cmluZyhOT0RFX1NUQVRFX0FMTE9DQVRFRCkpOwotCQl9Ci0KLQkJc2x1cm1fZnJlZV9ub2RlX2luZm9fbXNnKG1zZyk7Ci0JfQotCi1jbGVhbnVwOgotCWlmKHVua25vd25fc2V0KQotCQlmcmVlX3Jhbmdlc2V0KHVua25vd25fc2V0KTsKLQlpZihkb3duX3NldCkJCi0JCWZyZWVfcmFuZ2VzZXQoZG93bl9zZXQpOwotCWlmKGlkbGVfc2V0KQkKLQkJZnJlZV9yYW5nZXNldChpZGxlX3NldCk7Ci0JaWYgKGFsbG9jYXRlZF9zZXQpCQotCQlmcmVlX3Jhbmdlc2V0KGFsbG9jYXRlZF9zZXQpOwotCi0JcmV0dXJuOwotfQotCi0KLS8qCi0gKiBzaWduYWwgaGFuZGxlciBvZiBzbHVybSBwcm94eS4gCi0gKi8KLVJFVFNJR1RZUEUKLXB0cF9zaWduYWxfaGFuZGxlcihpbnQgc2lnKQotewotCWlmIChzaWcgIT0gU0lHQ0hMRCkgIC8qIHByb3h5IGRvZXNuJ3QgZXhpdCBvbiBTSUdDSExEICovIAotCQlwdHBfc2lnbmFsX2V4aXQgPSBzaWc7Ci19Ci0KLS8qCi0gKiBDbGVhbnVwIHdvcmsgb24gcHJveHkgZXhpdGluZzoKLSAqICBraWxsIHNydW4gcHJvY2VzcywgcmVsZWFzZSBqb2IgcmVzb3VyY2UsIAotICoJdGVybWluYXRlIGlvX3RocmVhZCxhbmQgZnJlZSBzcGFjZS4KLSAqLwotc3RhdGljIHZvaWQKLWRlc3Ryb3lfZ2xvYmFsX2pvYmxpc3QoKQotewotCXB0cF9qb2IgKiBqOwotCQotCWZvciAoU2V0TGlzdChnSm9iTGlzdCk7IChqID0gKHB0cF9qb2IgKilHZXRMaXN0RWxlbWVudChnSm9iTGlzdCkpICE9IE5VTEw7ICkgewotCQlpZiAoc2x1cm1fam9iX2FjdGl2ZShqKSkgewotCQkJa2lsbChqLT5zcnVuX3BpZCwgU0lHS0lMTCk7Ci0JCQlzbHVybV9raWxsX2pvYihqLT5zbHVybV9qb2JpZCwgU0lHS0lMTCwgMCk7Ci0JCX0JCi0JCWlmIChqLT5pb3RocmVhZF9leGl0ID09IGZhbHNlKQotCQkJai0+aW90aHJlYWRfZXhpdF9yZXEgPSB0cnVlOwotCQlSZW1vdmVGcm9tTGlzdChnSm9iTGlzdCwgaik7Ci0JCWZyZWVfam9iKGopOwotCX0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLXNlcnZlcihjaGFyICpuYW1lLCBjaGFyICpob3N0LCBpbnQgcG9ydCkKLXsKLQlpbnQJCQkJcmMgPSAwOwotCXN0cnVjdCB0aW1ldmFsCXRpbWVvdXQgPSB7MCwgMjAwMDB9OwotCi0JZ0pvYkxpc3QgPSBOZXdMaXN0KCk7Ci0JZ01hY2hpbmVMaXN0ID0gTmV3TGlzdCgpOwotCQotCWluaXRfam9iX3RpbWVyKCk7Ci0JaW5pdF9ub2RlX3RpbWVyKCk7Ci0KLQlpZiAocHJveHlfc3ZyX2luaXQobmFtZSwgJnRpbWVvdXQsICZoZWxwZXJfZnVuY3MsICZjb21tYW5kX3RhYiwgJnNsdXJtX3Byb3h5KSAhPSBQUk9YWV9SRVNfT0spIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCAicHJveHkgZmFpbGVkIHRvIGluaXRpYWxpemVkXG4iKTsgCi0JCXJldHVybiAwOwotCX0KLQkKLQlpZiAocHJveHlfc3ZyX2Nvbm5lY3Qoc2x1cm1fcHJveHksIGhvc3QsIHBvcnQpID09IFBST1hZX1JFU19PSykgewotCQlkZWJ1Z19sb2cobG9nZnAsICJwcm94eSBjb25uZWN0ZWRcbiIpOyAKLQkJCi0JCXdoaWxlIChwdHBfc2lnbmFsX2V4aXQgPT0gMCAmJiBwcm94eV9zdGF0ZSAhPSBTVEFURV9TSFVURE9XTikgewotCQkJaWYgKHByb3h5X3N0YXRlID09IFNUQVRFX1NIVVRUSU5HX0RPV04pIHsKLQkJCQlwcm94eV9zdGF0ZSA9IFNUQVRFX1NIVVRET1dOOwotCQkJfQotCQkJaWYgKHByb3h5X3N2cl9wcm9ncmVzcyhzbHVybV9wcm94eSkgIT0gUFJPWFlfUkVTX09LKQotCQkJCWJyZWFrOwotCQkJLyogdXBkYXRlIGpvYiBhbmQgbm9kZSBzdGF0ZSAqLwkKLQkJCWlmIChlbmFibGVfc3RhdGVfdXBkYXRlKSB7Ci0JCQkJaWYgKGpvYl91cGRhdGVfdGltZW91dCgpKSAgCi0JCQkJCXVwZGF0ZV9qb2Jfc3RhdGUoQUxMX0pPQlNUQVRFKTsgCi0JCQkJaWYgKG5vZGVfdXBkYXRlX3RpbWVvdXQoKSkgCi0JCQkJCXVwZGF0ZV9ub2RlX3N0YXRlKCk7Ci0JCQl9Ci0JCQkvKiBkZWxldGUgcmVtb3ZhYmxlIGpvYiAqLwotCQkJcHVyZ2VfZ2xvYmFsX2pvYmxpc3QoKTsKLQkJfQotCQlpZiAocHRwX3NpZ25hbF9leGl0ICE9IDApIHsKLQkJCWlmIChwcm94eV9zdGF0ZSAhPSBTVEFURV9TSFVUVElOR19ET1dOCi0JCQkJJiYgcHJveHlfc3RhdGUgIT0gU1RBVEVfU0hVVERPV04pIHsKLQkJCQlkb19zbHVybV9zaHV0ZG93bigpOwotCQkJfQotCQkJCi0JCQlkZXN0cm95X2dsb2JhbF9qb2JsaXN0KCk7Ci0KLQkJCS8qIG91ciByZXR1cm4gY29kZSA9IHRoZSBzaWduYWwgdGhhdCBmaXJlZCAqLwotCQkJcmMgPSBwdHBfc2lnbmFsX2V4aXQ7Ci0JCQlkZWJ1Z19sb2cobG9nZnAsICJwdHBfc2x1cm1fcHJveHkgdGVybWluYXRlZCBieSBzaWduYWwgWyVkXVxuIiwgcHRwX3NpZ25hbF9leGl0KTsKLQkJfQotCX0gZWxzZSAKLQkJZGVidWdfbG9nKGxvZ2ZwLCAicHJveHkgY29ubmVjdGlvbiBmYWlsZWRcbiIpOyAKLQkKLQlwcm94eV9zdnJfZmluaXNoKHNsdXJtX3Byb3h5KTsKLQkKLQlyZXR1cm4gcmM7Ci19Ci0KLQotLyoKLSAqIEVudHJ5IHJvdXRpbmUKLSAqLwotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JaW50IAljaDsKLQlpbnQJCXBvcnQgPSBQUk9YWV9UQ1BfUE9SVDsKLQljaGFyICoJaG9zdCA9IERFRkFVTFRfSE9TVDsKLQljaGFyICoJcHJveHlfc3RyID0gREVGQVVMVF9QUk9YWTsKLQlpbnQJCXJjOwotCQotCXdoaWxlICgoY2ggPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDpwOmg6IiwgbG9uZ29wdHMsIE5VTEwpKSAhPSAtMSl7IAotCQlzd2l0Y2ggKGNoKSB7Ci0JCWNhc2UgJ1AnOgotCQkJcHJveHlfc3RyID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkJcG9ydCA9IChpbnQpc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2gnOgotCQkJaG9zdCA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICIlcyBbLS1wcm94eT1wcm94eV0gWy0taG9zdD1ob3N0X25hbWVdIFstLXBvcnQ9cG9ydF0gXG4iLCBhcmd2WzBdKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQkKLQotCS8vcHV0ZW52KCJQVFBfU0xVUk1fUFJPWFlfTE9HRElSPSRIT01FL2xvZyIpOwotCWxvZ2ZwID0gaW5pdF9sb2dmcCgpOwotCi0JLyogCi0JICogc2lnbmFsIGNhbiBoYXBwZW4gYW55IHRpbWUgYWZ0ZXIgaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgc28KLQkgKiBtYWtlIHN1cmUgd2UgY2F0Y2ggaXQuCi0JICovCi0JcHRwX3NpZ25hbF9leGl0ID0gMDsKLQkKLQkvKiBzZXR1cCBzaWduYWwgaGFuZGxlcnMgKi8KLQl4c2lnbmFsKFNJR0lOVCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQl4c2lnbmFsKFNJR0hVUCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQl4c2lnbmFsKFNJR0lMTCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQl4c2lnbmFsKFNJR1NFR1YsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0JeHNpZ25hbChTSUdURVJNLCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotCXhzaWduYWwoU0lHUVVJVCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQl4c2lnbmFsKFNJR0FCUlQsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0JeHNpZ25hbChTSUdDSExELCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotCQotCXJjID0gc2VydmVyKHByb3h5X3N0ciwgaG9zdCwgcG9ydCk7Ci0JCi0JcmV0dXJuIHJjOwotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE4MTRmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3B0cC9ybS9yZW1vdGUvY29yZS8qIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9ybS9yZW1vdGUvdWkvKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTEyYmVkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk4OWEzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkuQWN0aXZhdG9yDQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsDQotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsDQotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLA0KLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSIzLjAuMCIsDQotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWksDQotIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLmxhdW5jaDtidW5kbGUtdmVyc2lvbj0iMy4wLjAiLA0KLSBvcmcuZWNsaXBzZS5wdHAudWk7YnVuZGxlLXZlcnNpb249IjMuMC4wIiwNCi0gb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZTtidW5kbGUtdmVyc2lvbj0iMy4wLjAiDQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkucHJlZmVyZW5jZXMNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDZmM2EuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5BYm91dDwvdGl0bGU+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+DQotIA0KLTxwPkFwcmkgMTQsIDIwMDk8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTVjZjg2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBiaW4vLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg2MzMyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotICMgQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgU2Nob29sIG9mIENvbXB1dGVyLE5hdGlvbmFsIFVuaXZlcnNpdHkgDQotICMgb2YgRGVmZW5zZSBUZWNobm9sb2d5LFAuUi5DaGluYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtDQotICMgYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgDQotICMgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwNCi0gIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICMgQ29udHJpYnV0b3JzOg0KLSAjIFNjaG9vbCBvZiBDb21wdXRlciAtIDYwNSBzdGFmZiByb29tDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLXBsdWdpbk5hbWU9UFRQIFNsdXJtIFVJDQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOGU1YjkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+DQotPHBsdWdpbj4NCi0NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnJtUHJlZmVyZW5jZXNQYWdlIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkucHJlZmVyZW5jZXMuU0xVUk1QcmVmZXJlbmNlUGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNsdXJtLnVpLnByZWZlcmVuY2VzLlNMVVJNUHJlZmVyZW5jZVBhZ2UiDQotICAgICAgICAgICAgbmFtZT0iU0xVUk0iPg0KLSAgICAgIDwvcGFnZT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucm1MYXVuY2hDb25maWd1cmF0aW9ucyI+DQotICAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb24NCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbi5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zbHVybS51aS5sYXVuY2hDb25maWd1cmF0aW9uIi8+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5wcm92aWRlcnMiPg0KLSAgICAgIDxwcm92aWRlcg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkuU0xVUk1TZXJ2aWNlUHJvdmlkZXIiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5TTFVSTVNlcnZpY2VQcm92aWRlciINCi0gICAgICAgICAgICBuYW1lPSJTTFVSTSINCi0gICAgICAgICAgICBzZXJ2aWNlSWQ9Im9yZy5lY2xpcHNlLnB0cC5jb3JlLkxhdW5jaFNlcnZpY2UiPg0KLSAgICAgIDwvcHJvdmlkZXI+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWkucHJvdmlkZXJDb250cmlidXRvcnMiPg0KLSAgICAgIDxwcm92aWRlckNvbnRyaWJ1dG9yDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS5TTFVSTVByb3ZpZGVyQ29udHJpYnV0b3IiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5TTFVSTVNlcnZpY2VQcm92aWRlciI+DQotICAgICAgPC9wcm92aWRlckNvbnRyaWJ1dG9yPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9BY3RpdmF0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1N2RhOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5TTFVSTVByZWZlcmVuY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlDQotICovDQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gew0KLQ0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgQWN0aXZhdG9yKCkgew0KLQkJcGx1Z2luID0gdGhpczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlTTFVSTVByZWZlcmVuY2VNYW5hZ2VyLmluaXRpYWxpemVQcmVmZXJlbmNlcygpOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcGx1Z2luID0gbnVsbDsNCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbg0KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGgNCi0JICoNCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgNCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7DQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9TTFVSTVByb3ZpZGVyQ29udHJpYnV0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9TTFVSTVByb3ZpZGVyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxOTI1NC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvU0xVUk1Qcm92aWRlckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLndpemFyZHMuU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuSVJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STVNlcnZpY2VQcm92aWRlckNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgU0xVUk1Qcm92aWRlckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVNlcnZpY2VQcm92aWRlckNvbnRyaWJ1dG9yIAotewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IjY29uZmlndXJlU2VydmljZVByb3ZpZGVyKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciwgQ29tcG9zaXRlIGNvbXApIAotCXsKLQkJLy8gTm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IjZ2V0V2l6YXJkKG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXIsIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZCBnZXRXaXphcmQoSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciwgSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyZXR1cm4gbmV3IFJNU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZChwcm92aWRlciwgcGFnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciNnZXRXaXphcmRQYWdlcyhvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCwgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgV2l6YXJkUGFnZVtdIGdldFdpemFyZFBhZ2VzKElXaXphcmQgd2l6YXJkLCBJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyKSAKLQl7Ci0JCVdpemFyZFBhZ2Ugd2l6YXJkUGFnZXNbXTsKLQkJCi0JCXdpemFyZFBhZ2VzID0gbmV3IFdpemFyZFBhZ2VbMV07Ci0JCXdpemFyZFBhZ2VzWzBdID0gbmV3IFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UoKElSTUNvbmZpZ3VyYXRpb25XaXphcmQpd2l6YXJkKTsKLQkJcmV0dXJuIHdpemFyZFBhZ2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL1NMVVJNU2VydmljZVByb3ZpZGVyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvU0xVUk1TZXJ2aWNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0MDgyMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvU0xVUk1TZXJ2aWNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlclNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5TTFVSTVByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJtc3lzdGVtLklTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uU0xVUk1SZXNvdXJjZU1hbmFnZXI7Ci0KLQotLyoqCi0gKiBTZXJ2aWNlIHByb3ZpZGVyIGZvciBJQk0gUGFyYWxsZWwgRW52aXJvbm1lbnQKLSAqLwotcHVibGljIGNsYXNzIFNMVVJNU2VydmljZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIgaW1wbGVtZW50cyBJU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0xVUk1EX1BBVEggPSAic2x1cm1kUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NMVVJNRF9BUkdTID0gInNsdXJtZEFyZ3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TTFVSTURfREVGQVVMVFMgPSAic2x1cm1kRGVmYXVsdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotCi0JcHVibGljIFNMVVJNU2VydmljZVByb3ZpZGVyKCkgCi0JewotCQlzdXBlcigpOwotCQlwcmVmZXJlbmNlcyA9IFNMVVJNUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJc2V0RGVzY3JpcHRpb24oIlNMVVJNIFJlc291cmNlIE1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTTFVSTVNlcnZpY2VQcm92aWRlcihTTFVSTVNlcnZpY2VQcm92aWRlciBwcm92aWRlcikKLQl7Ci0JCXN1cGVyKHByb3ZpZGVyKTsKLQkJcHJlZmVyZW5jZXMgPSBTTFVSTVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JCXNldFNsdXJtZEFyZ3MocHJvdmlkZXIuZ2V0U2x1cm1kQXJncygpKTsKLQkJc2V0U2x1cm1kUGF0aChwcm92aWRlci5nZXRTbHVybWRQYXRoKCkpOwotCQlzZXRVc2VEZWZhdWx0cyhwcm92aWRlci5nZXRVc2VEZWZhdWx0cygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3ZpZGVyI2Nsb25lKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlyZXR1cm4gbmV3IFNMVVJNU2VydmljZVByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIjY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCkgewotCQlJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSA9IChJUFVuaXZlcnNlQ29udHJvbCkgUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKTsKLQkJcmV0dXJuIG5ldyBTTFVSTVJlc291cmNlTWFuYWdlcihJbnRlZ2VyLnZhbHVlT2YodW5pdmVyc2UuZ2V0TmV4dFJlc291cmNlTWFuYWdlcklkKCkpLCB1bml2ZXJzZSwgdGhpcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm92aWRlciNnZXRSZXNvdXJjZU1hbmFnZXJJZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU1hbmFnZXJJZCgpIHsKLQkJcmV0dXJuIGdldElkKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJtc3lzdGVtLklTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jZ2V0U2x1cm1kQXJncygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTbHVybWRBcmdzKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKFRBR19TTFVSTURfQVJHUywgcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEVNUFRZX1NUUklORykpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5ybXN5c3RlbS5JU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI2dldFNsdXJtZFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2x1cm1kUGF0aCgpIHsKLQkJcmV0dXJuIGdldFN0cmluZyhUQUdfU0xVUk1EX1BBVEgsIHByZWZlcmVuY2VzLmdldFN0cmluZyhFTVBUWV9TVFJJTkcpKTsKLQl9Ci0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNnZXRVc2VEZWZhdWx0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0VXNlRGVmYXVsdHMoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuKFRBR19TTFVSTURfREVGQVVMVFMsIHRydWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyI2lzQ29uZmlndXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jc2V0RGVmYXVsdE5hbWVBbmREZXNjKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZUFuZERlc2MoKQotICAgIHsKLQkJU3RyaW5nIG5hbWUgPSAiU0xVUk0iOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb25uID0gZ2V0Q29ubmVjdGlvbk5hbWUoKTsKLQkJaWYgKGNvbm4gIT0gbnVsbCAmJiAhY29ubi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJICAgIG5hbWUgKz0gIkAiICsgY29ubjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldE5hbWUobmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKCJTTFVSTSBSZXNvdXJjZSBNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXRTbHVybWRBcmdzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2x1cm1kQXJncyhTdHJpbmcgc2x1cm1kQXJncykgewotCQlwdXRTdHJpbmcoVEFHX1NMVVJNRF9BUkdTLCBzbHVybWRBcmdzKTsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJtc3lzdGVtLklTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jc2V0U2x1cm1kUGF0aChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNsdXJtZFBhdGgoU3RyaW5nIHNsdXJtZFBhdGgpIHsKLQkJcHV0U3RyaW5nKFRBR19TTFVSTURfUEFUSCwgc2x1cm1kUGF0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXRVc2VEZWZhdWx0cyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRzKGJvb2xlYW4gdXNlRGVmYXVsdHMpIHsKLQkJcHV0Qm9vbGVhbihUQUdfU0xVUk1EX0RFRkFVTFRTLCB1c2VEZWZhdWx0cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkNWMwMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS5tZXNzYWdlczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX25hbWU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzY3JpcHRpb247DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8wOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8zOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl82Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzg7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl85Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTA7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbmFtZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV90aXRsZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZWZhdWx0QnV0dG9uOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Jyb3dzZUJ1dHRvbjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9wYXRoOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2FyZ3VtZW50czsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3NlbGVjdDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3JfbXNnOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX251bVByb2NzSW52YWxpZDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV90aW1lTGltaXRJbnZhbGlkOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9ncm91cF9zbHVybWQ7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUHJlZmVyZW5jZXNQYWdlX3NsdXJtZEZpbGVfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2VfU2VsZWN0X1NMVVJNZF9GSUxFOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9JbmNvcnJlY3RfU0xVUk1kX2ZpbGU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUHJlZmVyZW5jZXNQYWdlX3NsdXJtZEFyZ3NfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2Vfc2x1cm1kRnVsbF90ZXh0Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9ncm91cF9wcm94eTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2Vfc2x1cm1TZXJ2ZXJfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2VfU2VsZWN0X1NMVVJNX1BST1hZX0ZJTEU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUHJlZmVyZW5jZXNQYWdlX0luY29ycmVjdF9zZXJ2ZXJfZmlsZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2VfbWFudWFsOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9icm93c2VCdXR0b247DQotCQ0KLQlzdGF0aWMgew0KLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgew0KLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuDQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkNWE4Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbmFtZT1TTFVSTSBQcm94eSBDb25maWd1cmF0aW9uDQotU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV90aXRsZT1TTFVSTSBQcm94eSBDb25maWd1cmF0aW9uDQotU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25uZWN0IHRvIGFuIFNMVVJNIHByb3h5IHNlcnZlcg0KLVNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8wPU51bWJlciBvZiBQcm9jZXNzZXMoLW4pOiANCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMT1UaW1lIExpbWl0KC10KToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTA9UGxlYXNlIGlucHV0IHRoZSBsaW1pdCg+PTEpIG9mIHJ1bm5pbmcgdGltZShtaW51dGVzKVwhDQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzI9UGFydGF0aW9uIFJlcXVlc3RlZCgtcCk6DQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzM9Sm9iIFR5cGUoLS1qb2J0eXBlKToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfND10cnVlDQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzU9Sm9iIElvIExhYmVsKC1sKToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNj10cnVlDQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzc9Sm9iIFZlcmJvc2UgTW9kZSgtdik6DQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzg9Sm9iIE5vZGVsaXN0KC13KToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfOT1QbGVhc2UgaW5wdXQgdGhlIGludGVnZXIgbnVtYmVyKD49MSkgb2YgcHJvY2Vzc2VzXCENCi0NCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX25hbWU9U0xVUk1EIENvbmZpZ3VyYXRpb24NCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlPVNMVVJNRCBDb25maWd1cmF0aW9uDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25maWd1cmUgU0xVUk1EDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZWZhdWx0QnV0dG9uPVVzZSBkZWZhdWx0IHNldHRpbmdzDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9icm93c2VCdXR0b249QnJvd3NlDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9wYXRoPVBhdGggdG8gU0xVUk1EOg0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfYXJndW1lbnRzPUV4dHJhIFNMVVJNRCBhcmd1bWVudHM6DQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkPUludmFsaWQgU0xVUk1EIHBhdGgNCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3NlbGVjdD1TZWxlY3QgU0xVUk1EIGV4ZWN1dGFibGUNCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3I9Q29ubmVjdGlvbiBFcnJvcg0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcl9tc2c9Q291bGQgbm90IG9wZW4gY29ubmVjdGlvbg0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbnVtUHJvY3NJbnZhbGlkPQ0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGltZUxpbWl0SW52YWxpZD0NCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9ncm91cF9zbHVybWQ9T3BlbiBSdW50aW1lIEVudmlyb25tZW50IERhZW1vbg0KLVNMVVJNUHJlZmVyZW5jZXNQYWdlX3NsdXJtZEZpbGVfdGV4dD1TTFVSTWQgZmlsZToNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9TZWxlY3RfU0xVUk1kX0ZJTEU9U2VsZWN0IFNMVVJNZCBmaWxlDQotU0xVUk1QcmVmZXJlbmNlc1BhZ2VfSW5jb3JyZWN0X1NMVVJNZF9maWxlPUludmFsaWQgU0xVUk0gZGFlbW9uIGZpbGUNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9zbHVybWRBcmdzX3RleHQ9U0xVUk1kIGFyZ3VtZW50czoNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9zbHVybWRGdWxsX3RleHQ9U0xVUk1kIHJ1biBjb21tYW5kOg0KLVNMVVJNUHJlZmVyZW5jZXNQYWdlX2dyb3VwX3Byb3h5PVNsdXJtIFBUUCBQcm94eSBTZXJ2ZXINCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9zbHVybVNlcnZlcl90ZXh0PVNMVVJNfFBUUCBwcm94eSBzZXJ2ZXIgZmlsZToNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9TZWxlY3RfU0xVUk1fUFJPWFlfRklMRT1TZWxlY3QgU0xVUk18UFRQIFByb3h5IHNlcnZlciBmaWxlDQotU0xVUk1QcmVmZXJlbmNlc1BhZ2VfSW5jb3JyZWN0X3NlcnZlcl9maWxlPUludmFsaWQgU0xVUk18UFRQIHByb3h5IHNlcnZlciBmaWxlDQotU0xVUk1QcmVmZXJlbmNlc1BhZ2VfbWFudWFsPUxhdW5jaCBTTFVSTSBzZXJ2ZXIgbWFudWFsbHkNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9icm93c2VCdXR0b249QnJvd3NlDQotDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3ByZWZlcmVuY2VzL1NMVVJNUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9wcmVmZXJlbmNlcy9TTFVSTVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGEwMWIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3ByZWZlcmVuY2VzL1NMVVJNUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS5wcmVmZXJlbmNlczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5TTFVSTVByZWZlcmVuY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0UmVtb3RlUHJlZmVyZW5jZVBhZ2U7DQotDQotcHVibGljIGNsYXNzIFNMVVJNUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlIHsNCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RSZW1vdGVQcmVmZXJlbmNlUGFnZSNnZXRQcmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7DQotCQlyZXR1cm4gU0xVUk1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOw0KLQl9DQotCQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlI3NhdmVQcmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7DQotCQlTTFVSTVByZWZlcmVuY2VNYW5hZ2VyLnNhdmVQcmVmZXJlbmNlcygpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1NMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY1ODYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5STUxhdW5jaFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLlNMVVJNSm9iQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLkFjdGl2YXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7DQotDQotcHVibGljIGNsYXNzIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBleHRlbmRzDQotCQlBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgew0KLQkNCi0JLy9qb2JOdW1Qcm9jZXMNCi0JcHJpdmF0ZSBUZXh0IG51bVByb2NzVGV4dDsNCi0JcHJpdmF0ZSBTdHJpbmcgbnVtUHJvY3NTdHJpbmcgPSAiMSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUl9PRl9QUk9DRVNTRVNfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMDsNCi0JLy9qb2JOdW1Ob2Rlcw0KLQkvKg0KLQlwcml2YXRlIFRleHQgTnVtTm9kZXNUZXh0Ow0KLQlwcml2YXRlIFN0cmluZyBudW1iZXJub2Rlc1N0cmluZyA9ICIyIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9OVU1CRVJfT0ZfTk9ERVNfTEFCRUwgPSAiTnVtYmVyIG9mIE5vZGVzKC1OKTogIjsNCi0JKi8NCi0JLy9qb2JUaW1lTGltaXQNCi0JcHJpdmF0ZSBUZXh0IFRpbWVMaW1pdFRleHQ7DQotCXByaXZhdGUgU3RyaW5nIHRpbWVMaW1pdFN0cmluZyA9ICIyIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX1RJTUVfTElNSVRfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTsNCi0JLy9qb2JQYXJ0aXRpb24NCi0JcHJpdmF0ZSBTdHJpbmcgcGFydGF0aW9uUmVxdWVzdGVkU3RyaW5nID0gIjMiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfUEFSVEFUSU9OX0xBQkVMID0gTWVzc2FnZXMuU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzI7DQotCS8vam9iVHlwZQ0KLQlwcml2YXRlIFN0cmluZyBqb2JUeXBlQ29tYm9TdHJpbmcgPSAibXBpIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX1RZUEVfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMzsNCi0JLy9qb2JJb0xhYmVsDQotCXByaXZhdGUgU3RyaW5nIGpvYklvU3RyaW5nID0gTWVzc2FnZXMuU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzQ7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfSU9fTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNTsNCi0JLy9qb2JWZXJib3NlDQotCXByaXZhdGUgU3RyaW5nIGpvYlZlcmJvc2VNb2RTdHJpbmcgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9WRVJCT1NFX01PREVfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNzsNCi0JLy9qb2JOb2RlTGlzdA0KLQlwcml2YXRlIFN0cmluZyBqb2JOb2RlTGlzdFN0cmluZyA9ICJub2RlMCxub2RlMSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9OT0RFX0xJU1RfTEFCRUwgPU1lc3NhZ2VzLlNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl84Ow0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJFRklYID0gQWN0aXZhdG9yLlBMVUdJTl9JRCArICIubGF1bmNoQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNUFJPQ1MgPSBBVFRSX1BSRUZJWCArICIubnVtUHJvY3MiOwkgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1OT0RFUyA9IEFUVFJfUFJFRklYICsgIi5udW1Ob2RlcyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVElNRUxJTUlUID0gQVRUUl9QUkVGSVggKyAiLnRpbWVMaW1pdCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSk9CUEFSVEFUSU9OID0gQVRUUl9QUkVGSVggKyAiLmpvYnBhcnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSk9CVFlQRSA9IEFUVFJfUFJFRklYICsgIi5qb2J0eXBlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9KT0JJTyA9IEFUVFJfUFJFRklYICsgIi5qb2JpbyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSk9CVkVSQk9TRU1PREUgPSBBVFRSX1BSRUZJWCArICIuam9idmVyYm9zZW1vZGUiOwkgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSTUxhdW5jaFZhbGlkYXRpb24gc3VjY2VzcyA9IG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOw0KLQ0KLQlwdWJsaWMgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjY2FuU2F2ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSkNCi0JICovDQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gY2FuU2F2ZShDb250cm9sIGNvbnRyb2wsIElSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtUHJvY3NBdHRyRGVmID0gZ2V0TnVtUHJvY3NBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKG51bVByb2NzQXR0ckRlZiwgbnVtUHJvY3NTdHJpbmcpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTlVNQkVSX09GX1BST0NFU1NFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCQ0KLQkJLyoNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iTnVtTm9kZXNBdHRyRGVmID0gZ2V0Sm9iTnVtTm9kZXNBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYk51bU5vZGVzQXR0ckRlZiwgbnVtYmVybm9kZXNTdHJpbmcpOw0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ0aGUgaWF0dHIgdmFsdWUgaXM6IitpYXR0cisidGhlIG51bXByb2NzU3RyaW5nIHZhbHVlIGlzOiIrbnVtUHJvY3NTdHJpbmcpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCSovDQotCQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVGltZUxpbWl0QXR0ckRlZiA9IGdldEpvYlRpbWVMaW1pdEF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iVGltZUxpbWl0QXR0ckRlZiwgdGltZUxpbWl0U3RyaW5nKTsJCQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RJTUVfTElNSVRfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQkvKg0KLQkJDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlBhcnRhdGlvbkF0dHJEZWYgPSBnZXRKb2JQYXJ0YXRpb25BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlBhcnRhdGlvbkF0dHJEZWYsIHBhcnRhdGlvblJlcXVlc3RlZFN0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJDQotCQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVHlwZUNvbWJvQXR0ckRlZiA9IGdldEpvYlR5cGVDb21ib0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iVHlwZUNvbWJvQXR0ckRlZiwgam9iVHlwZUNvbWJvU3RyaW5nKTsJCQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQkNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JJb0F0dHJEZWYgPSBnZXRKb2JJb0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJb1N0cmluZyk7CQkNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9JT19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0JCQ0KLQkJKi8NCi0JCQkJDQotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7DQotCQlHcmlkRGF0YSBnZDsNCi0JCQ0KLQkJZmluYWwgaW50IG51bUNvbHVtbnMgPSAyOw0KLQkJDQotCQlmaW5hbCBDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULkJPUkRFUik7DQotCQlHcmlkTGF5b3V0IGxhdW5jaENvbmZpZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KG51bUNvbHVtbnMsIHRydWUpOw0KLQkJbGF1bmNoQ29uZmlnTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7DQotCQlsYXVuY2hDb25maWdMYXlvdXQubWFyZ2luV2lkdGggPSAwOw0KLQkJbGF1bmNoQ29uZmlnTGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOw0KLQkJY29tcC5zZXRMYXlvdXQobGF1bmNoQ29uZmlnTGF5b3V0KTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7DQotCQljb21wLnNldExheW91dERhdGEoZ2QpOw0KLQkJDQotCQkNCi0JCUxhYmVsIG51bWJlck9mUHJvY2Vzc2VzbkxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsNCi0JCW51bWJlck9mUHJvY2Vzc2VzbkxhYmVsLnNldFRleHQoTlVNQkVSX09GX1BST0NFU1NFU19MQUJFTCk7DQotCQlmaW5hbCBHcmlkRGF0YSBnZF9udW1iZXJPZlByb2Nlc3Nlc25MYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAxLCAxKTsNCi0JCWdkX251bWJlck9mUHJvY2Vzc2VzbkxhYmVsLm1pbmltdW1XaWR0aCA9IG51bWJlck9mUHJvY2Vzc2VzbkxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsNCi0JCW51bWJlck9mUHJvY2Vzc2VzbkxhYmVsLnNldExheW91dERhdGEoZ2RfbnVtYmVyT2ZQcm9jZXNzZXNuTGFiZWwpOw0KLQkJDQotCQkNCi0JCW51bVByb2NzVGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7DQotCQludW1Qcm9jc1RleHQuc2V0VGV4dExpbWl0KDEwKTsNCi0JCW51bVByb2NzVGV4dC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfOSk7DQotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCBudW1Db2x1bW5zLTEsIDEpOw0KLQkJZ2QubWluaW11bVdpZHRoID0gbnVtUHJvY3NUZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsNCi0JCW51bVByb2NzVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsNCi0NCi0JCS8vIFRlbGwgdGhlIGNsaWVudCBvZiB0aGlzIGR5bmFtaWMgdGFiIHRoYXQgdGhlDQotCQkvLyBjb250ZW50cyBvZiB0aGlzIHRhYiBhcmUgYWZmZWN0ZWQgYnkgdGhlIGNvbnRlbnRzDQotCQkvLyBvZiB0aGlzIHdpZGdldC4NCi0JCW51bVByb2NzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsNCi0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlRoZSB2YWx1ZSBvZiBudW1Qcm9jc1N0cmluZzoiK251bVByb2NzU3RyaW5nKTsNCi0JCQkJbnVtUHJvY3NTdHJpbmcgPSBudW1Qcm9jc1RleHQuZ2V0VGV4dCgpOw0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIG51bVByb2NzU3RyaW5nMToiK251bVByb2NzU3RyaW5nKTsNCi0JCQkJZmlyZUNvbnRlbnRzQ2hhbmdlZCgpOw0KLQkJCX19KTsNCi0gICAgICAgIC8qDQotCQlmaW5hbCBMYWJlbCBudW1iZXJPZk5vZGVzTGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOw0KLQkJbnVtYmVyT2ZOb2Rlc0xhYmVsLnNldFRleHQoSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCk7DQotDQotCQlOdW1Ob2Rlc1RleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOw0KLQkJTnVtTm9kZXNUZXh0LnNldFRleHRMaW1pdCgxMCk7DQotCQlOdW1Ob2Rlc1RleHQuc2V0VG9vbFRpcFRleHQoIlBsZWFzZSBpbnB1dCB0aGUgbnVtYmVyIG9mIG5vZGVzISIpOw0KLQkJZmluYWwgR3JpZERhdGEgZ2RfbnVtTm9kZXNUZXh0ID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7DQotCQlOdW1Ob2Rlc1RleHQuc2V0TGF5b3V0RGF0YShnZF9udW1Ob2Rlc1RleHQpOw0KLQkJLy9OdW1Ob2Rlc1RleHQgICB2YWx1ZQ0KLQkJTnVtTm9kZXNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpew0KLQ0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgew0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIG51bWJlcm5vZGVzU3RyaW5nOiIrbnVtYmVybm9kZXNTdHJpbmcpOw0KLQkJCQludW1iZXJub2Rlc1N0cmluZyA9IE51bU5vZGVzVGV4dC5nZXRUZXh0KCk7DQotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJUaGUgdmFsdWUgb2YgbnVtYmVybm9kZXNTdHJpbmcxOiIrbnVtYmVybm9kZXNTdHJpbmcpOw0KLQkJCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7DQotCQkJfX0pOw0KLQkJDQotICAgICAgICAqLw0KLQkJZmluYWwgTGFiZWwgdGltZUxpbWl0TGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOw0KLQkJdGltZUxpbWl0TGFiZWwuc2V0VGV4dChKT0JfVElNRV9MSU1JVF9MQUJFTCk7DQotDQotCQlUaW1lTGltaXRUZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsNCi0JCVRpbWVMaW1pdFRleHQuc2V0VGV4dExpbWl0KDEwKTsNCi0JCVRpbWVMaW1pdFRleHQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzEwKTsNCi0JCWZpbmFsIEdyaWREYXRhIGdkX3RpbWVMaW1pdFRleHQgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsNCi0JCVRpbWVMaW1pdFRleHQuc2V0TGF5b3V0RGF0YShnZF90aW1lTGltaXRUZXh0KTsNCi0JCS8vVGltZUxpbWl0VGV4dCAgIHZhbHVlDQotCQlUaW1lTGltaXRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpew0KLQ0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgew0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIHRpbWVMaW1pdFN0cmluZzoiK3RpbWVMaW1pdFN0cmluZyk7DQotCQkJCXRpbWVMaW1pdFN0cmluZyA9IFRpbWVMaW1pdFRleHQuZ2V0VGV4dCgpOw0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIHRpbWVMaW1pdFN0cmluZzE6Iit0aW1lTGltaXRTdHJpbmcpOw0KLQkJCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7DQotCQkJfX0pOw0KLQkJLy9wYXJ0YXRpb25SZXF1ZXN0ZWRDb21ibyAgIHZhbHVlDQotCQkvL0pvYklkVGV4dCAgIHZhbHVlDQotCQkvL2pvYlR5cGVDb21ibyAgIHZhbHVlDQotCQkvL0pvYklPTGFibGVUZXh0ICAgdmFsdWUNCi0JCS8vSm9iVmVyYm9zZU1vZGVUZXh0ICB2YWx1ZQ0KLQkJLy9Kb2JOb2RlbGlzdFRleHQgIHZhbHVlDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNnZXRBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFF1ZXVlLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQ0KLQkgKi8NCi0JcHVibGljIElBdHRyaWJ1dGU8Pyw/LD8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLA0KLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkNCi0JCWludCBudW1Qcm9jcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNUFJPQ1MsIC0xKTsNCi0JCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBudW1Qcm9jc0F0dHJEZWYgPSBnZXROdW1Qcm9jc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKG51bVByb2NzQXR0ckRlZiwgbnVtUHJvY3MpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVbMF07DQotCQl9DQotCQkNCi0JCS8qCQkJCQ0KLQkJaW50IGpvYk51bU5vZGVzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9OVU1OT0RFUywgLTEpOw0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlRoZSB2YWx1ZSBvZiBqb2JOdW1Ob2RlcyBpczogIitqb2JOdW1Ob2Rlcyk7DQotCQ0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjEgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JOdW1Ob2Rlc0F0dHJEZWYgPSBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0cjEgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JOdW1Ob2Rlc0F0dHJEZWYsIGpvYk51bU5vZGVzKTsNCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIE51bU5vZGVzIGlzOiAiK2lhdHRyMSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVsxXTsNCi0JCX0NCi0JCSovCQkJDQotCQlpbnQgam9iVGltZUxpbWl0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9USU1FTElNSVQsIC0xKTsNCi0JCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIyID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVGltZUxpbWl0QXR0ckRlZiA9IGdldEpvYlRpbWVMaW1pdEF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0cjIgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JUaW1lTGltaXRBdHRyRGVmLCBqb2JUaW1lTGltaXQpOw0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJUaGUgdmFsdWUgb2YgVGltZUxpbWl0IGlzOiAiK2lhdHRyMik7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVsyXTsNCi0JCX0NCi0JCQ0KLQkJLyoJCQkNCi0JCWludCBqb2JQYXJ0YXRpb24gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0pPQlBBUlRBVElPTiwgLTEpOw0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjMgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JQYXJ0YXRpb25BdHRyRGVmID0gZ2V0Sm9iUGFydGF0aW9uQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyMiA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlBhcnRhdGlvbkF0dHJEZWYsIGpvYlBhcnRhdGlvbik7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVszXTsNCi0JCX0NCi0JCQkJCQ0KLQkJaW50IGpvYlR5cGVDb21ibyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSk9CVFlQRSwgLTEpOw0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjMgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUeXBlQ29tYm9BdHRyRGVmID0gZ2V0Sm9iVGltZUxpbWl0QXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyMiA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlR5cGVDb21ib0F0dHJEZWYsIGpvYlR5cGVDb21ibyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVszXTsNCi0JCX0JCQkNCi0JCQkNCi0JCWludCBqb2JJbyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSk9CSU8sIC0xKTsNCi0JCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIzID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iSW9BdHRyRGVmID0gZ2V0Sm9iSW9BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJaWF0dHIzID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJbyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVszXTsNCi0JCX0NCi0JCSovDQotCQkNCi0JCQ0KLQkJDQotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVbXXtpYXR0cixpYXR0cjJ9Ow0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjZ2V0Q29udHJvbCgpDQotCSAqLw0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQkJcmV0dXJuIGNvbnRyb2w7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikNCi0JICovDQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gaW5pdGlhbGl6ZUZyb20oQ29udHJvbCBjb250cm9sLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLA0KLQkJCUlQUXVldWUgcXVldWUsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsNCi0JCQ0KLQkJaW50IG51bVByb2NzOw0KLQkJdHJ5IHsNCi0JCQludW1Qcm9jcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNUFJPQ1MsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtUHJvY3NBdHRyRGVmID0gZ2V0TnVtUHJvY3NBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJCW51bVByb2NzVGV4dC5zZXRUZXh0KG51bVByb2NzQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTlVNQkVSX09GX1BST0NFU1NFU19MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIE5VTUJFUl9PRl9QUk9DRVNTRVNfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQludW1Qcm9jc1RleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKG51bVByb2NzKSk7DQotCQkvKg0KLQkJaW50IGpvYk51bU5vZGVzOw0KLQkJdHJ5IHsNCi0JCQlqb2JOdW1Ob2RlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNTk9ERVMsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iTnVtTm9kZXNBdHRyRGVmID0gZ2V0Sm9iTnVtTm9kZXNBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJCU51bU5vZGVzVGV4dC5zZXRUZXh0KGpvYk51bU5vZGVzQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfTlVNQkVSX09GX05PREVTX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJTnVtTm9kZXNUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhqb2JOdW1Ob2RlcykpOw0KLQkJKi8JCQ0KLQkJaW50IGpvYlRpbWVMaW1pdDsNCi0JCXRyeSB7DQotCQkJam9iVGltZUxpbWl0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9USU1FTElNSVQsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVGltZUxpbWl0QXR0ckRlZiA9IGdldEpvYlRpbWVMaW1pdEF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQkJVGltZUxpbWl0VGV4dC5zZXRUZXh0KGpvYlRpbWVMaW1pdEF0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWVBc1N0cmluZygpKTsNCi0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZTEpIHsNCi0JCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9USU1FX0xJTUlUX0xBQkVMICsNCi0JCQkJCQllLmdldE1lc3NhZ2UoKSArICIgOiAiICsgZTEuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RJTUVfTElNSVRfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQlUaW1lTGltaXRUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhqb2JUaW1lTGltaXQpKTsNCi0JCS8qCQkNCi0JCWludCBqb2JQYXJ0YXRpb247DQotCQl0cnkgew0KLQkJCWpvYlBhcnRhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSk9CUEFSVEFUSU9OLCAxKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXRyeSB7DQotCQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlBhcnRhdGlvbkF0dHJEZWYgPSBnZXRKb2JQYXJ0YXRpb25BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJCXBhcnRhdGlvblJlcXVlc3RlZENvbWJvLnNldFRleHQoam9iUGFydGF0aW9uQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1BBUlRBVElPTl9MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJcGFydGF0aW9uUmVxdWVzdGVkQ29tYm8uc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGpvYlBhcnRhdGlvbikpOw0KLQkJaW50IGpvYlR5cGVDb207DQotCQl0cnkgew0KLQkJCWpvYlR5cGVDb20gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0pPQlRZUEUsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVHlwZUNvbWJvQXR0ckRlZiA9IGdldEpvYlR5cGVDb21ib0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQkJam9iVHlwZUNvbWJvLnNldFRleHQoam9iVHlwZUNvbWJvQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKw0KLQkJCQkJCWUuZ2V0TWVzc2FnZSgpICsgIiA6ICIgKyBlMS5nZXRNZXNzYWdlKCkpOw0KLQkJCX0NCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQlqb2JUeXBlQ29tYm8uc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGpvYlR5cGVDb20pKTsJDQotCQlpbnQgam9iSW87DQotCQl0cnkgew0KLQkJCWpvYklvID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9KT0JJTywgMSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQl0cnkgew0KLQkJCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JJb0F0dHJEZWYgPSBnZXRKb2JJb0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQkJSm9iSU9MYWJsZVRleHQuc2V0VGV4dChqb2JJb0F0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWVBc1N0cmluZygpKTsNCi0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZTEpIHsNCi0JCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9JT19MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfSU9fTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQlKb2JJT0xhYmxlVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoam9iSW8pKTsNCi0JCSovDQotCQlyZXR1cm4gc3VjY2VzczsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpDQotCSAqLw0KLQ0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwNCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7DQotCQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtUHJvY3NBdHRyRGVmID0gZ2V0TnVtUHJvY3NBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKG51bVByb2NzQXR0ckRlZiwgbnVtUHJvY3NTdHJpbmcpOw0KLQkJCWlmIChpYXR0ci5nZXRWYWx1ZSgpIDwgMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9udW1Qcm9jc0ludmFsaWQpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIE5VTUJFUl9PRl9QUk9DRVNTRVNfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQkvKg0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JOdW1Ob2Rlc0F0dHJEZWYgPSBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iTnVtTm9kZXNBdHRyRGVmLCBudW1iZXJub2Rlc1N0cmluZyk7DQotCQkJaWYgKGlhdHRyLmdldFZhbHVlKCkgPCAxKSB7DQotCQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UubnVtYmVybm9kZXNJbnZhbGlkIikpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCSovDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlRpbWVMaW1pdEF0dHJEZWYgPSBnZXRKb2JUaW1lTGltaXRBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlRpbWVMaW1pdEF0dHJEZWYsIHRpbWVMaW1pdFN0cmluZyk7DQotCQkJaWYgKGlhdHRyLmdldFZhbHVlKCkgPCAxKSB7DQotCQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpbWVMaW1pdEludmFsaWQpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9USU1FX0xJTUlUX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJLyoNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iUGFydGF0aW9uQXR0ckRlZiA9IGdldEpvYlBhcnRhdGlvbkF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iUGFydGF0aW9uQXR0ckRlZiwgcGFydGF0aW9uUmVxdWVzdGVkU3RyaW5nKTsNCi0JCQlpZiAoaWF0dHIuZ2V0VmFsdWUoKSA8IDEpIHsNCi0JCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIE1lc3NhZ2VzLmdldFN0cmluZygiU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5udW1Qcm9jc0ludmFsaWQiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUeXBlQ29tYm9BdHRyRGVmID0gZ2V0Sm9iVHlwZUNvbWJvQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLQkJCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JUeXBlQ29tYm9BdHRyRGVmLCBqb2JUeXBlQ29tYm9TdHJpbmcpOw0KLQkJCWlmIChpYXR0ci5nZXRWYWx1ZSgpIDwgMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLm51bVByb2NzSW52YWxpZCIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9UWVBFX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JJb0F0dHJEZWYgPSBnZXRKb2JJb0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJb1N0cmluZyk7DQotCQkJaWYgKGlhdHRyLmdldFZhbHVlKCkgPCAxKSB7DQotCQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UubnVtUHJvY3NJbnZhbGlkIikpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX0lPX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJKi8NCi0JCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsICIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjcGVyZm9ybUFwcGx5KG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSwgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpDQotCSAqLw0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sDQotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG51bGw7DQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG51bVByb2NzQXR0ckRlZiA9IGdldE51bVByb2NzQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUobnVtUHJvY3NBdHRyRGVmLCBudW1Qcm9jc1N0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBOVU1CRVJfT0ZfUFJPQ0VTU0VTX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9OVU1QUk9DUywgaWF0dHIuZ2V0VmFsdWUoKSk7DQotCQkvKg0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjEgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JOdW1Ob2Rlc0F0dHJEZWYgPSBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0cjEgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JOdW1Ob2Rlc0F0dHJEZWYsIG51bWJlcm5vZGVzU3RyaW5nKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9OVU1CRVJfT0ZfTk9ERVNfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX05VTU5PREVTLCBpYXR0cjEuZ2V0VmFsdWUoKSk7DQotCQkqLw0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjIgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUaW1lTGltaXRBdHRyRGVmID0gZ2V0Sm9iVGltZUxpbWl0QXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyMiA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlRpbWVMaW1pdEF0dHJEZWYsIHRpbWVMaW1pdFN0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfVElNRV9MSU1JVF9MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKEFUVFJfVElNRUxJTUlULCBpYXR0cjIuZ2V0VmFsdWUoKSk7DQotCQkvKg0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JQYXJ0YXRpb25BdHRyRGVmID0gZ2V0Sm9iUGFydGF0aW9uQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iUGFydGF0aW9uQXR0ckRlZiwgcGFydGF0aW9uUmVxdWVzdGVkU3RyaW5nKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9QQVJUQVRJT05fTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX0pPQlBBUlRBVElPTiwgaWF0dHIuZ2V0VmFsdWUoKSk7DQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlR5cGVDb21ib0F0dHJEZWYgPSBnZXRKb2JUeXBlQ29tYm9BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJaWF0dHIgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JUeXBlQ29tYm9BdHRyRGVmLCBqb2JUeXBlQ29tYm9TdHJpbmcpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX1RJTUVMSU1JVCwgaWF0dHIuZ2V0VmFsdWUoKSk7DQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYklvQXR0ckRlZiA9IGdldEpvYklvQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJb1N0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfSU9fTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX0pPQklPLCBpYXR0ci5nZXRWYWx1ZSgpKTsNCi0JCSovDQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihBVFRSX05VTU5PREVTKTsNCi0JCQ0KLQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNzZXREZWZhdWx0cyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHksIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFF1ZXVlKQ0KLQkgKi8NCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sDQotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBudW1Qcm9jc0F0dHJEZWYgPSBnZXROdW1Qcm9jc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX05VTVBST0NTLCBudW1Qcm9jc0F0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWUoKSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBOVU1CRVJfT0ZfUFJPQ0VTU0VTX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJLyoNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iTnVtTm9kZXNBdHRyRGVmID0gZ2V0Sm9iTnVtTm9kZXNBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9OVU1OT0RFUywgam9iTnVtTm9kZXNBdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlKCkpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCSovDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlRpbWVMaW1pdEF0dHJEZWYgPSBnZXRKb2JUaW1lTGltaXRBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9USU1FTElNSVQsIGpvYlRpbWVMaW1pdEF0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWUoKSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfVElNRV9MSU1JVF9MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCS8qDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlBhcnRhdGlvbkF0dHJEZWYgPSBnZXRKb2JQYXJ0YXRpb25BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9KT0JQQVJUQVRJT04sIGpvYlBhcnRhdGlvbkF0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWUoKSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUeXBlQ29tYm9BdHRyRGVmID0gZ2V0Sm9iVHlwZUNvbWJvQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKEFUVFJfSk9CVFlQRSwgam9iVHlwZUNvbWJvQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZSgpKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9UWVBFX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iSW9BdHRyRGVmID0gZ2V0Sm9iSW9BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9KT0JJTywgam9iSW9BdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlKCkpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX0lPX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQkNCi0JCSovDQotCQlyZXR1cm4gc3VjY2VzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgam9iIGxhdW5jaCBhdHRyaWJ1dGUNCi0JICogDQotCSAqIEBwYXJhbSBybQ0KLQkgKiBAcGFyYW0gcXVldWUNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJpdmF0ZSBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXROdW1Qcm9jc0F0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIEpvYkF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZQcm9jZXNzZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCk7DQotCX0NCi0JcHJpdmF0ZSBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIFNMVVJNSm9iQXR0cmlidXRlcy5nZXROdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpOw0KLQl9DQotCXByaXZhdGUgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0Sm9iVGltZUxpbWl0QXR0ckRlZihJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7DQotCQlyZXR1cm4gU0xVUk1Kb2JBdHRyaWJ1dGVzLmdldFRpbWVMaW1pdEF0dHJpYnV0ZURlZmluaXRpb24oKTsNCi0JfQ0KLQkvKg0KLQlwcml2YXRlIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldEpvYlBhcnRhdGlvbkF0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIEpvYkF0dHJpYnV0ZXMuZ2V0Sm9iUGFydGF0aW9uQXR0cmlidXRlRGVmaW5pdGlvbigpOw0KLQl9DQotCXByaXZhdGUgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0Sm9iVHlwZUNvbWJvQXR0ckRlZihJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7DQotCQlyZXR1cm4gSm9iQXR0cmlidXRlcy5nZXRKb2JUeXBlQ29tYm9BdHRyaWJ1dGVEZWZpbml0aW9uKCk7DQotCX0NCi0JcHJpdmF0ZSBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRKb2JJb0F0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIEpvYkF0dHJpYnV0ZXMuZ2V0Sm9iSW9BdHRyaWJ1dGVEZWZpbml0aW9uKCk7DQotCX0NCi0JKi8NCi0JLy9uZWVkIHRvIG1vZGlmeSBKb2JBdHRyaWJ1dGVzLmphdmENCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWJjM2UuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS5ybUxhdW5jaENvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJtc3lzdGVtLlNMVVJNUmVzb3VyY2VNYW5hZ2VyOw0KLQ0KLXB1YmxpYyBjbGFzcyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkgZXh0ZW5kcw0KLQkJQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IHsNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBkb0NyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyIHJtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbmV3IFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihybSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVJlc291cmNlTWFuYWdlcj4gZ2V0UmVzb3VyY2VNYW5hZ2VyQ2xhc3MoKSB7DQotCQlyZXR1cm4gU0xVUk1SZXNvdXJjZU1hbmFnZXIuY2xhc3M7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3dpemFyZHMvU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3dpemFyZHMvU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk2Y2I2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IA0KLSAqIFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYQ0KLSAqDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAJCQlQZWljaGFuZyBTaGkgPHBjbXV0YXRlc0AxNjMuY29tPi88cGNzaGlAbnVkdC5lZHUuY24+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkud2l6YXJkczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLlBUUFJlbW90ZUNvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlGaWxlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlTZXJ2aWNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5QVFBSZW1vdGVVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLkFjdGl2YXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5JUk1Db25maWd1cmF0aW9uV2l6YXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LlNXVFV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7DQotDQotcHVibGljIGNsYXNzIFNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsNCi0JDQotCXByb3RlY3RlZCBjbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgDQotCXsNCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZ0KSB7DQotCQkJT2JqZWN0IHNvdXJjZSA9IGV2dC5nZXRTb3VyY2UoKTsNCi0JCQlpZighbG9hZGluZyAmJiAoc291cmNlID09IHBhdGhUZXh0IHx8IHNvdXJjZSA9PSBhcmdzVGV4dCkpIHsNCi0JCQkJdXBkYXRlUGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JDQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7DQotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEZpZWxkRWRpdG9yLklTX1ZBTElEKSkgew0KLQkJCQl1cGRhdGVQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkNCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsNCi0JCQlpZiAoc291cmNlID09IGJyb3dzZUJ1dHRvbikgew0KLQkJCQloYW5kbGVQYXRoQnJvd3NlQnV0dG9uU2VsZWN0ZWQoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQl1cGRhdGVTZXR0aW5ncygpOw0KLQkJCQl1cGRhdGVQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWc7DQotCXByaXZhdGUgU3RyaW5nIHNsdXJtZFBhdGggPSBFTVBUWV9TVFJJTkc7DQotCXByaXZhdGUgU3RyaW5nIHNsdXJtZEFyZ3MgPSBFTVBUWV9TVFJJTkc7DQotCXByaXZhdGUgSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2VzID0gbnVsbDsNCi0JcHJpdmF0ZSBJUmVtb3RlQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsNCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRpbmcgPSB0cnVlOw0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZDsNCi0JcHJpdmF0ZSBib29sZWFuIHVzZURlZmF1bHRzOw0KLQlwcml2YXRlIFRleHQgcGF0aFRleHQgPSBudWxsOw0KLQ0KLQlwcml2YXRlIFRleHQgYXJnc1RleHQgPSBudWxsOw0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b24gPSBudWxsOw0KLQlwcml2YXRlIEJ1dHRvbiBkZWZhdWx0QnV0dG9uID0gbnVsbDsNCi0JcHJpdmF0ZSBXaWRnZXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBXaWRnZXRMaXN0ZW5lcigpOw0KLQkNCi0JcHVibGljIFNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UoSVJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsNCi0JCXN1cGVyKHdpemFyZCwgTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9uYW1lKTsNCi0JCXNldFRpdGxlKE1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGUpOw0KLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbik7DQotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7DQotCQlpc1ZhbGlkID0gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotCQlHcmlkTGF5b3V0IHRvcExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KHRvcExheW91dCk7DQotCQljcmVhdGVDb250ZW50cyhjb21wb3NpdGUpOw0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTYXZlIHRoZSBjdXJyZW50IHN0YXRlIGluIHRoZSBSTSBjb25maWd1cmF0aW9uLiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlcg0KLQkgKiBhbnl0aGluZyBpcyBjaGFuZ2VkLg0KLQkgKiANCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgDQotCXsNCi0JCXN0b3JlKCk7DQotCQljb25maWcuc2V0VXNlRGVmYXVsdHModXNlRGVmYXVsdHMpOw0KLQkJaWYgKCF1c2VEZWZhdWx0cykgew0KLQkJCWNvbmZpZy5zZXRTbHVybWRQYXRoKHNsdXJtZFBhdGgpOw0KLQkJCWNvbmZpZy5zZXRTbHVybWRBcmdzKHNsdXJtZEFyZ3MpOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQotCQlpZiAodmlzaWJsZSkgew0KLQkJCWluaXRDb250ZW50cygpOw0KLQkJfQ0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHdpemFyZCBwYWdlLg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmVudA0KLQkgKiBAcGFyYW0gY29sU3Bhbg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCS8qDQotCQkgKiBDb21wb3NpdGUgZm9yIHJlbW90ZSBwcm92aWRlciBhbmQgcHJveHkgbG9jYXRpb24gY29tYm8ncw0KLQkJICovDQotCQlDb21wb3NpdGUgY29udGVudHMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOw0KLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsNCi0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMzsNCi0JCWNvbnRlbnRzLnNldExheW91dERhdGEoZ2QpOw0KLQ0KLQkJLyoNCi0JCSAqIERlZmF1bHQNCi0JCSAqLw0KLQkJZGVmYXVsdEJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGNvbnRlbnRzLCBNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2RlZmF1bHRCdXR0b24pOw0KLQkJZGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7DQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOw0KLQkJZGVmYXVsdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsNCi0NCi0JCS8qDQotCQkgKiBTTFVSTUQgcGF0aA0KLQkJICovDQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOw0KLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3BhdGgpOw0KLQ0KLQkJcGF0aFRleHQgPSBuZXcgVGV4dChjb250ZW50cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMTsNCi0JCWdkLndpZHRoSGludCA9IDYwOw0KLQkJcGF0aFRleHQuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7DQotCQkNCi0JCWJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlUHVzaEJ1dHRvbihjb250ZW50cywgTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9icm93c2VCdXR0b24sIG51bGwpOw0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsNCi0JCQ0KLQkJLyoNCi0JCSAqIFNMVVJNRCBhcmdzDQotCQkgKi8NCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7DQotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfYXJndW1lbnRzKTsNCi0JCQ0KLQkJYXJnc1RleHQgPSBuZXcgVGV4dChjb250ZW50cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMjsNCi0JCWFyZ3NUZXh0LnNldExheW91dERhdGEoZ2QpOw0KLQkJYXJnc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgY29udHJvbHMuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgaW5pdENvbnRlbnRzKCkgew0KLQkJbG9hZGluZyA9IHRydWU7DQotCQljb25maWcgPSAoSVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbilnZXRDb25maWd1cmF0aW9uV2l6YXJkKCkuZ2V0Q29uZmlndXJhdGlvbigpOw0KLQkJbG9hZFNhdmVkKCk7DQotCQl1cGRhdGVTZXR0aW5ncygpOw0KLQkJZGVmYXVsdFNldHRpbmcoKTsNCi0JCWxvYWRpbmcgPSBmYWxzZTsNCi0JCXVwZGF0ZVBhZ2UoKTsJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBMb2FkIHRoZSBpbml0aWFsIHdpemFyZCBzdGF0ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzLg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGxvYWRTYXZlZCgpDQotCXsNCi0JCXVzZURlZmF1bHRzID0gY29uZmlnLmdldFVzZURlZmF1bHRzKCk7DQotCQlzbHVybWRQYXRoID0gY29uZmlnLmdldFNsdXJtZFBhdGgoKTsNCi0JCXNsdXJtZEFyZ3MgPSBjb25maWcuZ2V0U2x1cm1kQXJncygpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHBhcmFtIGINCi0JICovDQotCXByaXZhdGUgdm9pZCBzZXRWYWxpZChib29sZWFuIGIpIHsNCi0JCWlzVmFsaWQgPSBiOw0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzVmFsaWQpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgc3RvcmUoKSANCi0Jew0KLQkJaWYgKCFsb2FkaW5nKSB7DQotCQkJaWYgKGRlZmF1bHRCdXR0b24gIT0gbnVsbCkgew0KLQkJCQl1c2VEZWZhdWx0cyA9IGRlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7DQotCQkJfQ0KLQkJCWlmIChwYXRoVGV4dCAhPSBudWxsKSB7DQotCQkJCXNsdXJtZFBhdGggPSBwYXRoVGV4dC5nZXRUZXh0KCk7DQotCQkJfQ0KLQkJCWlmIChhcmdzVGV4dCAhPSBudWxsKSB7DQotCQkJCXNsdXJtZEFyZ3MgPSBhcmdzVGV4dC5nZXRUZXh0KCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogVXBkYXRlIHdpemFyZCBVSSBzZWxlY3Rpb25zIGZyb20gc2V0dGluZ3MuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkNCi0JICogc2V0dGluZ3MgYXJlIGNoYW5nZWQuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2V0dGluZ3MoKSB7DQotCQlzdG9yZSgpOw0KLQkJcGF0aFRleHQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdHMpOw0KLQkJYXJnc1RleHQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdHMpOw0KLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoIXVzZURlZmF1bHRzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGJ1dHRvbiB3aWRnZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyZW50DQotCSAqIEBwYXJhbSBsYWJlbA0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIHRoZSBidXR0b24gd2lkZ2V0DQotCSAqLw0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCB0eXBlKSB7DQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHR5cGUpOw0KLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOw0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7DQotCQlyZXR1cm4gYnV0dG9uOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGNoZWNrIGJ1dHRvbiB3aWRnZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyZW50DQotCSAqIEBwYXJhbSBsYWJlbA0KLQkgKiBAcmV0dXJuIHRoZSBjaGVjayBidXR0b24gd2lkZ2V0DQotCSAqLw0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUNoZWNrQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgew0KLQkJcmV0dXJuIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGxhYmVsLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBncmlkIGxheW91dC4NCi0JICogDQotCSAqIEBwYXJhbSBjb2x1bW5zDQotCSAqIEBwYXJhbSBpc0VxdWFsDQotCSAqIEBwYXJhbSBtaA0KLQkgKiBAcGFyYW0gbXcNCi0JICogQHJldHVybiB0aGUgbmV3IGdyaWQgbGF5b3V0DQotCSAqLw0KLQlwcm90ZWN0ZWQgR3JpZExheW91dCBjcmVhdGVHcmlkTGF5b3V0KGludCBjb2x1bW5zLCBib29sZWFuIGlzRXF1YWwsIGludCBtaCwgaW50IG13KSAgew0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IGNvbHVtbnM7DQotCQlncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGlzRXF1YWw7DQotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IG1oOw0KLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IG13Ow0KLQkJcmV0dXJuIGdyaWRMYXlvdXQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIG5ldyByYWRpbyBidXR0b24gaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQNCi0JICogbGF5b3V0IGRhdGEuDQotCSAqDQotCSAqIEBwYXJhbSBncm91cCAgdGhlIGNvbXBvc2l0ZSBpbiB3aGljaCB0byBjcmVhdGUgdGhlIHJhZGlvIGJ1dHRvbg0KLQkgKiBAcGFyYW0gbGFiZWwgIHRoZSBzdHJpbmcgdG8gc2V0IGludG8gdGhlIHJhZGlvIGJ1dHRvbg0KLQkgKiBAcGFyYW0gdmFsdWUgIHRoZSBzdHJpbmcgdG8gaWRlbnRpZnkgcmFkaW8gYnV0dG9uDQotCSAqIEByZXR1cm4gdGhlIG5ldyByYWRpbyBidXR0b24NCi0JICovIA0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHZhbHVlLCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJQnV0dG9uIGJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGxhYmVsLCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7DQotCQlidXR0b24uc2V0RGF0YSgobnVsbCA9PSB2YWx1ZSkgPyBsYWJlbCA6IHZhbHVlKTsNCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOw0KLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7DQotCQlpZihudWxsICE9IGxpc3RlbmVyKSB7DQotCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsNCi0JCX0NCi0JCXJldHVybiBidXR0b247DQotCX0NCi0JDQotCS8qKg0KLQkgKiANCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRlZmF1bHRTZXR0aW5nKCkgDQotCXsNCi0JCWRlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZmF1bHRzKTsNCi0JCXBhdGhUZXh0LnNldFRleHQoc2x1cm1kUGF0aCk7DQotCQlhcmdzVGV4dC5zZXRUZXh0KHNsdXJtZEFyZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDbGVhbiB1cCB0aGUgY29udGVudCBvZiBhIHRleHQgZmllbGQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdGV4dA0KLQkgKiBAcmV0dXJuIGNsZWFuZWQgdXAgdGV4dC4NCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRDb250ZW50KFN0cmluZyB0ZXh0KSANCi0Jew0KLQkJaWYgKHRleHQudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgdGV4dC5lcXVhbHMoRU1QVFlfU1RSSU5HKSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JDQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2hvdyBhIGRpYWxvZyB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IGEgZmlsZS4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhdGhCcm93c2VCdXR0b25TZWxlY3RlZCgpIA0KLQl7DQotCQkvKg0KLQkJICogTmVlZCB0byBkbyB0aGlzIGhlcmUgYmVjYXVzZSB0aGUgY29ubmVjdGlvbiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgDQotCQkgKiBieSB0aGUgcHJldmlvdXMgd2l6YXJkIHBhZ2UNCi0JCSAqLw0KLQkJU3RyaW5nIHJtSUQgPSBjb25maWcuZ2V0UmVtb3RlU2VydmljZXNJZCgpOw0KLQkJaWYgKHJtSUQgIT0gbnVsbCkgew0KLQkJCXJlbW90ZVNlcnZpY2VzID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMocm1JRCk7DQotCQkJU3RyaW5nIGNvbm4gPSBjb25maWcuZ2V0Q29ubmVjdGlvbk5hbWUoKTsNCi0JCQlpZiAocmVtb3RlU2VydmljZXMgIT0gbnVsbCAmJiBjb25uICE9IG51bGwpIHsNCi0JCQkJY29ubmVjdGlvbiA9IHJlbW90ZVNlcnZpY2VzLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0Q29ubmVjdGlvbihjb25uKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsNCi0JCQlpZiAoIWNvbm5lY3Rpb24uaXNPcGVuKCkpIHsNCi0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsNCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLA0KLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJY29ubmVjdGlvbi5vcGVuKG1vbml0b3IpOw0KLQkJCQkJCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgew0KLQkJCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yLA0KLQkJCQkJCQkJCU1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcl9tc2csDQotCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSkpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCQ0KLQkJCQl9Ow0KLQkJCQl0cnkgew0KLQkJCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOw0KLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCi0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3IsDQotCQkJCQkJCU1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcl9tc2csDQotCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLlBMVUdJTl9JRCwgZS5nZXRNZXNzYWdlKCkpKTsNCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvciwNCi0JCQkJCQkJTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yX21zZywNCi0JCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCUlSZW1vdGVVSVNlcnZpY2VzIHJlbW90ZVVJU2VydmljZXMgPSBQVFBSZW1vdGVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlVUlTZXJ2aWNlcyhyZW1vdGVTZXJ2aWNlcyk7DQotCQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZmlsZU1nciA9IHJlbW90ZVVJU2VydmljZXMuZ2V0VUlGaWxlTWFuYWdlcigpOw0KLQkJCQ0KLQkJCVN0cmluZyBpbml0aWFsUGF0aCA9ICIvLyI7IC8vIFN0YXJ0IGF0IHJvb3Qgc2luY2UgU0xVUk1EIGlzIHByb2JhYmx5IGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIHNvbWV3aGVyZSAvLyROT04tTkxTLTEkDQotCQkJSVBhdGggc2VsZWN0ZWRQYXRoID0gZmlsZU1nci5icm93c2VGaWxlKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3NlbGVjdCwgaW5pdGlhbFBhdGgpOw0KLQkJCWlmIChzZWxlY3RlZFBhdGggIT0gbnVsbCkgew0KLQkJCQlwYXRoVGV4dC5zZXRUZXh0KHNlbGVjdGVkUGF0aC50b1N0cmluZygpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4NCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRTZXR0aW5nKCkgDQotCXsNCi0JCWlmIChkZWZhdWx0QnV0dG9uICE9IG51bGwgJiYgZGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAocGF0aFRleHQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyBuYW1lID0gZ2V0RmllbGRDb250ZW50KHBhdGhUZXh0LmdldFRleHQoKSk7DQotCQkJaWYgKG5hbWUgPT0gbnVsbCkgew0KLQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkKTsgDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBzdHlsZQ0KLQkgKiBAcGFyYW0gc3BhY2UNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJvdGVjdGVkIEdyaWREYXRhIHNwYW5HcmlkRGF0YShpbnQgc3R5bGUsIGludCBzcGFjZSkgDQotCXsNCi0JCUdyaWREYXRhIGdkID0gbnVsbDsNCi0JCWlmIChzdHlsZSA9PSAtMSkNCi0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZWxzZQ0KLQkJCWdkID0gbmV3IEdyaWREYXRhKHN0eWxlKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhY2U7DQotCQlyZXR1cm4gZ2Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFnZSgpIA0KLQl7DQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7DQotCQlzZXRNZXNzYWdlKG51bGwpOw0KLQkNCi0JCWlmICghaXNWYWxpZFNldHRpbmcoKSkgew0KLQkJCXNldFZhbGlkKGZhbHNlKTsNCi0JCX0gZWxzZSB7CQ0KLQkJCXBlcmZvcm1PaygpOw0KLQkJCXNldFZhbGlkKHRydWUpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5YjM3NS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvd2l6YXJkcy9TTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IA0KLSAqIFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYQ0KLSAqDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAJCQlQZWljaGFuZyBTaGkgPHBjbXV0YXRlc0AxNjMuY29tPi88cGNzaGlAbnVkdC5lZHUuY24+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkud2l6YXJkczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS51aS53aXphcmRzLkFic3RyYWN0UmVtb3RlUHJveHlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5JUk1Db25maWd1cmF0aW9uV2l6YXJkOw0KLQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMNCi0JQWJzdHJhY3RSZW1vdGVQcm94eVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsNCi0JDQotCXB1YmxpYyBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKElSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7DQotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLlNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbmFtZSk7DQotCQlzZXRUaXRsZShNZXNzYWdlcy5TTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlKTsNCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzY3JpcHRpb24pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLmNsYXNzcGF0aCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8ucHJvamVjdCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDg4ZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGE4YmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNUaHUgSnVuIDE5IDA5OjE3OjA4IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA2ZTVjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBUZXN0cyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjIiLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSI1LjAuMCIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb247YnVuZGxlLXZlcnNpb249IjIuMS4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZTtidW5kbGUtdmVyc2lvbj0iMi4wLjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvcmVzb3VyY2VzL2luY2x1ZGVzL21waS5oIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9yZXNvdXJjZXMvaW5jbHVkZXMvbXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNzFjZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9yZXNvdXJjZXMvaW5jbHVkZXMvbXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg3ICswLDAgQEAKLS8qIG9tcGkvaW5jbHVkZS9tcGkuaC4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFRoZSBUcnVzdGVlcyBvZiBJbmRpYW5hIFVuaXZlcnNpdHkgYW5kIEluZGlhbmEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUmVzZWFyY2ggYW5kIFRlY2hub2xvZ3kKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRoZSBVbml2ZXJzaXR5IG9mIFRlbm5lc3NlZSBhbmQgVGhlIFVuaXZlcnNpdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFRlbm5lc3NlZSBSZXNlYXJjaCBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBDZW50ZXIgU3R1dHRnYXJ0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBvZiBTdHV0dGdhcnQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgICAgICBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogJENPUFlSSUdIVCQKLSAqCi0gKiBBZGRpdGlvbmFsIGNvcHlyaWdodHMgbWF5IGZvbGxvdwotICoKLSAqICRIRUFERVIkCi0gKi8KLQotI2lmbmRlZiBPTVBJX01QSV9ICi0jZGVmaW5lIE9NUElfTVBJX0gKLQotLyogVGhlIGNvbW1lbnQgYmVsb3cgKGFuZCB0aGUgZW5kaW5nIHBhcnRuZXIpIGFyZSBmb3IgYnVpbGRpbmcgZmF0Ci0gICBkaXN0cmlidXRpb25zIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQuICBQbGVhc2UgZG8gbm90IHJlbW92ZSAqLwotCi0vKiBAT01QSV9CRUdJTl9DT05GSUdVUkVfU0VDVElPTkAgKi8KLQotI2lmbmRlZiBPTVBJX0NPTkZJR19ICi0KLS8qIE9ubHkgaW5jbHVkZSB0aGVzZSBpZiBPTVBJX0NPTkZJR19IIGlzbid0IGRlZmluZWQgKG1lYW5pbmcgaWYKLSAgIG9tcGlfY29uZmlnLmggaGFzbid0IGFscmVhZHkgYmVlbiBpbmNsdWRlZCkuICBPdGhlcndpc2UsIHdlJ2xsCi0gICBkdXBsaWNhdGUgYWxsIHRob3NlIHN5bWJvbHMuICBPTVBJIGNvZGluZyBzdGFuZGFyZHMgc2F5IHRoYXQKLSAgIG9tcGlfY29uZmlnLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgYWxsIG90aGVyIGZpbGVzLCBzbyB0aGlzCi0gICBzaG91bGQgYmUgZ29vZCBlbm91Z2ggKi8KLQotLyogV2hldGhlciB3ZSBoYXZlIEZPUlRSQU4gSU5URUdFUioxIG9yIG5vdCAqLwotI2RlZmluZSBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMSAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIElOVEVHRVIqMTYgb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVIxNiAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIElOVEVHRVIqMiBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjIgMAotCi0vKiBXaGV0aGVyIHdlIGhhdmUgRk9SVFJBTiBJTlRFR0VSKjQgb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVI0IDAKLQotLyogV2hldGhlciB3ZSBoYXZlIEZPUlRSQU4gSU5URUdFUio4IG9yIG5vdCAqLwotI2RlZmluZSBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSOCAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIFJFQUwqMTYgb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX1JFQUwxNiAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIFJFQUwqNCBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDQgMAotCi0vKiBXaGV0aGVyIHdlIGhhdmUgRk9SVFJBTiBSRUFMKjggb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw4IDAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGxvbmcgbG9uZycuICovCi0jZGVmaW5lIEhBVkVfTE9OR19MT05HIDEKLQotLyogVGhlIHNpemUgb2YgYSBgYm9vbCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSNkZWZpbmUgU0laRU9GX0JPT0wgMQotCi0vKiBUaGUgc2l6ZSBvZiBhIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0jZGVmaW5lIFNJWkVPRl9JTlQgNAotCi0vKiBUeXBlIG9mIE1QSV9PZmZzZXQgLS0gaGFzIHRvIGJlIGRlZmluZWQgaGVyZSBhbmQgdHlwZWRlZidlZCBsYXRlciBiZWNhdXNlIG1waS5oIGRvZXMgbm90IGdldCBBQyBTVUJTVCdzICovCi0jZGVmaW5lIE9NUElfTVBJX09GRlNFVF9UWVBFIGxvbmcgbG9uZwotCi0vKiB0eXBlIHRvIHVzZSBmb3IgcHRyZGlmZl90LCBpZiBpdCBkb2VzIG5vdCBleGlzdCwgc2V0IHRvIHB0cmRpZmZfdCBpZiBpdCBkb2VzIGV4aXN0ICovCi0jZGVmaW5lIE9NUElfUFRSRElGRl9UWVBFIHB0cmRpZmZfdAotCi0vKiBXaGV0aGVyIHdlIHdhbnQgTVBJIGN4eCBzdXBwb3J0IG9yIG5vdCAqLwotI2RlZmluZSBPTVBJX1dBTlRfQ1hYX0JJTkRJTkdTIDEKLQotLyogZG8gd2Ugd2FudCB0byB0cnkgdG8gd29yayBhcm91bmQgQysrIGJpbmRpbmdzIFNFRUtfKiBpc3N1ZT8gKi8KLSNkZWZpbmUgT01QSV9XQU5UX01QSV9DWFhfU0VFSyAxCi0KLS8qIFdoZXRoZXIgYSBjb25zdF9jYXN0IG9uIGEgMi1kIGFycmF5IHdpbGwgd29yayB3aXRoIHRoZSBDKysgY29tcGlsZXIgKi8KLSNkZWZpbmUgT01QSV9DWFhfU1VQUE9SVFNfMkRfQ09OU1RfQ0FTVCAxCi0KLS8qIFdoZXRoZXIgd2Ugd2FudCB0aGUgTVBJIGY3NyBiaW5kaW5ncyBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9XQU5UX0Y3N19CSU5ESU5HUyAwCi0KLS8qIFdoZXRoZXIgd2Ugd2FudCB0aGUgTVBJIGY5MCBiaW5kaW5ncyBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9XQU5UX0Y5MF9CSU5ESU5HUyAwCi0KLS8qIFdoZXRoZXIgb3Igbm90IHdlIGhhdmUgY29tcGlsZWQgd2l0aCBDKysgZXhjZXB0aW9ucyBzdXBwb3J0ICovCi0jZGVmaW5lIE9NUElfSEFWRV9DWFhfRVhDRVBUSU9OX1NVUFBPUlQgMAotCi0vKiBNUEkgZGF0YXR5cGUgY29ycmVzcG9uZGluZyB0byBNUElfT2Zmc2V0ICovCi0jZGVmaW5lIE9NUElfT0ZGU0VUX0RBVEFUWVBFIE1QSV9MT05HX0xPTkcKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi0KLS8qIE1ham9yLCBtaW5vciwgYW5kIHJlbGVhc2UgdmVyc2lvbiBvZiBPcGVuIE1QSSAqLwotI2RlZmluZSBPTVBJX01BSk9SX1ZFUlNJT04gMQotI2RlZmluZSBPTVBJX01JTk9SX1ZFUlNJT04gMgotI2RlZmluZSBPTVBJX1JFTEVBU0VfVkVSU0lPTiAzCi0KLS8qIEEgIHR5cGUgdGhhdCBhbGxvd3MgdXMgdG8gaGF2ZSBzZW50aW5lbCB0eXBlIHZhbHVlcyB0aGF0IGFyZSBzdGlsbAotICAgdmFsaWQgKi8KLSNkZWZpbmUgb21waV9mb3J0cmFuX2JvZ3VzX3R5cGVfdCBpbnQKLQotLyogQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gRk9SVFJBTiBJTlRFR0VSICovCi0jZGVmaW5lIG9tcGlfZm9ydHJhbl9pbnRlZ2VyX3Qgb21waV9mb3J0cmFuX2JvZ3VzX3R5cGVfdAotCi0jaWZuZGVmIE9NUElfREVDTFNQRUMKLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKLSNkZWZpbmUgT01QSV9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNlbHNlCi0jZGVmaW5lIE9NUElfREVDTFNQRUMKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTVBJX0ZpbnQKLS8qIE1QSV9GaW50IGlzIHRoZSBzYW1lIGFzIG9tcGlfZm9ydHJhbl9JTlRFR0VSX3QgKi8KLSNkZWZpbmUgTVBJX0ZpbnQgb21waV9mb3J0cmFuX2ludGVnZXJfdAotI2VuZGlmCi0KLSNlbmRpZiAvKiAjaWZuZGVmIE9NUElfQ09ORklHX0ggKi8KLQotLyogQE9NUElfRU5EX0NPTkZJR1VSRV9TRUNUSU9OQCAqLwotCi0vKiBpbmNsdWRlIGZvciBwdHJkaWZmX3QgKi8KLSNpZmRlZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaWZuZGVmIE9NUElfQlVJTERJTkcKLSNkZWZpbmUgT01QSV9CVUlMRElORyAwCi0jZW5kaWYKLQotCi0vKgotICogSnVzdCBpbiBjYXNlIHlvdSBuZWVkIGl0LiAgOi0pCi0gKi8KLSNkZWZpbmUgT1BFTl9NUEkgMQotCi0vKgotICogTVBJIHZlcnNpb24KLSAqLwotI2RlZmluZSBNUElfVkVSU0lPTiAyCi0jZGVmaW5lIE1QSV9TVUJWRVJTSU9OIDAKLQotLyoKLSAqIFRvIGFjY29tb2RhdGUgcHJvZ3JhbXMgd3JpdHRlbiBmb3IgTVBJIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSBhCi0gKiBzdHJhaWdodCBST01JTyBpbXBvcnQKLSAqLwotI2lmICFPTVBJX0JVSUxESU5HCi0jZGVmaW5lIE1QSU9fUmVxdWVzdCBNUElfUmVxdWVzdAotI2RlZmluZSBNUElPX1Rlc3QgTVBJX1Rlc3QKLSNkZWZpbmUgTVBJT19XYWl0IE1QSV9XYWl0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoY19wbHVzcGx1cykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogVHlwZWRlZnMKLSAqLwotCi10eXBlZGVmIE9NUElfUFRSRElGRl9UWVBFIE1QSV9BaW50OwotdHlwZWRlZiBPTVBJX01QSV9PRkZTRVRfVFlQRSBNUElfT2Zmc2V0OwotdHlwZWRlZiBzdHJ1Y3Qgb21waV9jb21tdW5pY2F0b3JfdCAqTVBJX0NvbW07Ci10eXBlZGVmIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3QgKk1QSV9EYXRhdHlwZTsKLXR5cGVkZWYgc3RydWN0IG9tcGlfZXJyaGFuZGxlcl90ICpNUElfRXJyaGFuZGxlcjsKLXR5cGVkZWYgc3RydWN0IG9tcGlfZmlsZV90ICpNUElfRmlsZTsKLXR5cGVkZWYgc3RydWN0IG9tcGlfZ3JvdXBfdCAqTVBJX0dyb3VwOwotdHlwZWRlZiBzdHJ1Y3Qgb21waV9pbmZvX3QgKk1QSV9JbmZvOwotdHlwZWRlZiBzdHJ1Y3Qgb21waV9vcF90ICpNUElfT3A7Ci10eXBlZGVmIHN0cnVjdCBvbXBpX3JlcXVlc3RfdCAqTVBJX1JlcXVlc3Q7Ci10eXBlZGVmIHN0cnVjdCBvbXBpX3N0YXR1c19wdWJsaWNfdCBNUElfU3RhdHVzOwotdHlwZWRlZiBzdHJ1Y3Qgb21waV93aW5fdCAqTVBJX1dpbjsKLQotLyoKLSAqIE1QSV9TdGF0dXMKLSAqLwotc3RydWN0IG9tcGlfc3RhdHVzX3B1YmxpY190IHsKLSAgaW50IE1QSV9TT1VSQ0U7Ci0gIGludCBNUElfVEFHOwotICBpbnQgTVBJX0VSUk9SOwotICBpbnQgX2NvdW50OwotICBpbnQgX2NhbmNlbGxlZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBvbXBpX3N0YXR1c19wdWJsaWNfdCBvbXBpX3N0YXR1c19wdWJsaWNfdDsKLQotLyoKLSAqIFVzZXIgdHlwZWRlZnMKLSAqLwotdHlwZWRlZiBpbnQgKE1QSV9Db3B5X2Z1bmN0aW9uKShNUElfQ29tbSwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqLCBpbnQgKik7Ci10eXBlZGVmIGludCAoTVBJX0RlbGV0ZV9mdW5jdGlvbikoTVBJX0NvbW0sIGludCwgdm9pZCAqLCB2b2lkICopOwotdHlwZWRlZiBpbnQgKE1QSV9EYXRhcmVwX2V4dGVudF9mdW5jdGlvbikoTVBJX0RhdGF0eXBlLCBNUElfQWludCAqLCB2b2lkICopOwotdHlwZWRlZiBpbnQgKE1QSV9EYXRhcmVwX2NvbnZlcnNpb25fZnVuY3Rpb24pKHZvaWQgKiwgTVBJX0RhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgdm9pZCAqLCBNUElfT2Zmc2V0LCB2b2lkICopOwotdHlwZWRlZiB2b2lkIChNUElfQ29tbV9lcnJoYW5kbGVyX2ZuKShNUElfQ29tbSAqLCBpbnQgKiwgLi4uKTsKLXR5cGVkZWYgdm9pZCAoTVBJX0ZpbGVfZXJyaGFuZGxlcl9mbikoTVBJX0ZpbGUgKiwgaW50ICosIC4uLik7Ci10eXBlZGVmIHZvaWQgKE1QSV9XaW5fZXJyaGFuZGxlcl9mbikoTVBJX1dpbiAqLCBpbnQgKiwgLi4uKTsKLXR5cGVkZWYgdm9pZCAoTVBJX0hhbmRsZXJfZnVuY3Rpb24pKE1QSV9Db21tICosIGludCAqLCAuLi4pOwotdHlwZWRlZiB2b2lkIChNUElfVXNlcl9mdW5jdGlvbikodm9pZCAqLCB2b2lkICosIGludCAqLCBNUElfRGF0YXR5cGUgKik7Ci10eXBlZGVmIGludCAoTVBJX0NvbW1fY29weV9hdHRyX2Z1bmN0aW9uKShNUElfQ29tbSwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqLCBpbnQgKik7Ci10eXBlZGVmIGludCAoTVBJX0NvbW1fZGVsZXRlX2F0dHJfZnVuY3Rpb24pKE1QSV9Db21tLCBpbnQsIHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfVHlwZV9jb3B5X2F0dHJfZnVuY3Rpb24pKE1QSV9EYXRhdHlwZSwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqLCBpbnQgKik7Ci10eXBlZGVmIGludCAoTVBJX1R5cGVfZGVsZXRlX2F0dHJfZnVuY3Rpb24pKE1QSV9EYXRhdHlwZSwgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfV2luX2NvcHlfYXR0cl9mdW5jdGlvbikoTVBJX1dpbiwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLCB2b2lkICosIGludCAqKTsKLXR5cGVkZWYgaW50IChNUElfV2luX2RlbGV0ZV9hdHRyX2Z1bmN0aW9uKShNUElfV2luLCBpbnQsIHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfR3JlcXVlc3RfcXVlcnlfZnVuY3Rpb24pKHZvaWQgKiwgTVBJX1N0YXR1cyAqKTsKLXR5cGVkZWYgaW50IChNUElfR3JlcXVlc3RfZnJlZV9mdW5jdGlvbikodm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfR3JlcXVlc3RfY2FuY2VsX2Z1bmN0aW9uKSh2b2lkICosIGludCk7Ci0KLS8qCi0gKiBNaXNjZWxsYW5lb3VzIGNvbnN0YW50cwotICovCi0jZGVmaW5lIE1QSV9BTllfU09VUkNFICAgICAgICAgLTEgICAgICAvKiBtYXRjaCBhbnkgc291cmNlIHJhbmsgKi8KLSNkZWZpbmUgTVBJX1BST0NfTlVMTCAgICAgICAgICAtMiAgICAgIC8qIHJhbmsgb2YgbnVsbCBwcm9jZXNzICovCi0jZGVmaW5lIE1QSV9ST09UICAgICAgICAgICAgICAgLTQKLSNkZWZpbmUgTVBJX0FOWV9UQUcgICAgICAgICAgICAtMSAgICAgIC8qIG1hdGNoIGFueSBtZXNzYWdlIHRhZyAqLwotI2RlZmluZSBNUElfTUFYX1BST0NFU1NPUl9OQU1FIDI1NiAgICAgLyogbWF4IHByb2MuIG5hbWUgbGVuZ3RoICovCi0jZGVmaW5lIE1QSV9NQVhfRVJST1JfU1RSSU5HICAgMjU2ICAgICAvKiBtYXggZXJyb3IgbWVzc2FnZSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX01BWF9PQkpFQ1RfTkFNRSAgICA2NCAgICAgIC8qIG1heCBvYmplY3QgbmFtZSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX1VOREVGSU5FRCAgICAgICAgICAtMzI3NjYgIC8qIHVuZGVmaW5lZCBzdHVmZiAqLwotI2RlZmluZSBNUElfQ0FSVCAgICAgICAgICAgICAgIDEgICAgICAgLyogY2FydGVzaWFuIHRvcG9sb2d5ICovCi0jZGVmaW5lIE1QSV9HUkFQSCAgICAgICAgICAgICAgMiAgICAgICAvKiBncmFwaCB0b3BvbG9neSAqLwotI2RlZmluZSBNUElfS0VZVkFMX0lOVkFMSUQgICAgIC0xICAgICAgLyogaW52YWxpZCBrZXkgdmFsdWUgKi8KLQotLyoKLSAqIE1vcmUgY29uc3RhbnRzCi0gKi8KLSNkZWZpbmUgTVBJX0JPVFRPTSAgICAgICAgICAgICAgICgodm9pZCAqKSAwKSAgICAvKiBiYXNlIHJlZmVyZW5jZSBhZGRyZXNzICovCi0jZGVmaW5lIE1QSV9JTl9QTEFDRSAgICAgICAgICAgICAoKHZvaWQgKikgMSkgICAgLyogaW4gcGxhY2UgYnVmZmVyICovCi0jZGVmaW5lIE1QSV9CU0VORF9PVkVSSEVBRCAgICAgICAxMjggICAgIC8qIHNpemUgb2YgYnNlbmQgaGVhZGVyICsgcHRyICovCi0jZGVmaW5lIE1QSV9NQVhfSU5GT19LRVkgICAgICAgICAzNiAgICAgIC8qIG1heCBpbmZvIGtleSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX01BWF9JTkZPX1ZBTCAgICAgICAgIDI1NiAgICAgLyogbWF4IGluZm8gdmFsdWUgbGVuZ3RoICovCi0jZGVmaW5lIE1QSV9BUkdWX05VTEwgICAgICAgICAgICAoKGNoYXIgKiopIDApICAgLyogTlVMTCBhcmd1bWVudCB2ZWN0b3IgKi8KLSNkZWZpbmUgTVBJX0FSR1ZTX05VTEwgICAgICAgICAgICgoY2hhciAqKiopIDApICAvKiBOVUxMIGFyZ3VtZW50IHZlY3RvcnMgKi8KLSNkZWZpbmUgTVBJX0VSUkNPREVTX0lHTk9SRSAgICAgICgoaW50ICopIDApICAgIC8qIGRvbid0IHJldHVybiBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBNUElfTUFYX1BPUlRfTkFNRSAgICAgICAgMzYgICAgICAvKiBtYXggcG9ydCBuYW1lIGxlbmd0aCAqLwotI2RlZmluZSBNUElfTUFYX05BTUVfTEVOICAgICAgICAgTVBJX01BWF9QT1JUX05BTUUgLyogbWF4IHBvcnQgbmFtZSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX09SREVSX0MgICAgICAgICAgICAgIDAgICAgICAgLyogQyByb3cgbWFqb3Igb3JkZXIgKi8KLSNkZWZpbmUgTVBJX09SREVSX0ZPUlRSQU4gICAgICAgIDEgICAgICAgLyogRm9ydHJhbiBjb2x1bW4gbWFqb3Igb3JkZXIgKi8KLSNkZWZpbmUgTVBJX0RJU1RSSUJVVEVfQkxPQ0sgICAgIDAgICAgICAgLyogYmxvY2sgZGlzdHJpYnV0aW9uICovCi0jZGVmaW5lIE1QSV9ESVNUUklCVVRFX0NZQ0xJQyAgICAxICAgICAgIC8qIGN5Y2xpYyBkaXN0cmlidXRpb24gKi8KLSNkZWZpbmUgTVBJX0RJU1RSSUJVVEVfTk9ORSAgICAgIDIgICAgICAgLyogbm90IGRpc3RyaWJ1dGVkICovCi0jZGVmaW5lIE1QSV9ESVNUUklCVVRFX0RGTFRfREFSRyAoLTEpICAgIC8qIGRlZmF1bHQgZGlzdHJpYnV0aW9uIGFyZyAqLwotCi0vKgotICogU2luY2UgdGhlc2UgdmFsdWVzIGFyZSBhcmJpdHJhcnkgdG8gT3BlbiBNUEksIHdlIG1pZ2h0IGFzIHdlbGwgbWFrZQotICogdGhlbSB0aGUgc2FtZSBhcyBST01JTyBmb3IgZWFzZSBvZiBtYXBwaW5nLiAgVGhlc2UgdmFsdWVzIHRha2VuCi0gKiBmcm9tIFJPTUlPJ3MgbXBpby5oIGZpbGUuCi0gKi8KLSNkZWZpbmUgTVBJX01PREVfQ1JFQVRFICAgICAgICAgICAgICAxICAvKiBBRElPX0NSRUFURSAqLwotI2RlZmluZSBNUElfTU9ERV9SRE9OTFkgICAgICAgICAgICAgIDIgIC8qIEFESU9fUkRPTkxZICovCi0jZGVmaW5lIE1QSV9NT0RFX1dST05MWSAgICAgICAgICAgICAgNCAgLyogQURJT19XUk9OTFkgICovCi0jZGVmaW5lIE1QSV9NT0RFX1JEV1IgICAgICAgICAgICAgICAgOCAgLyogQURJT19SRFdSICAqLwotI2RlZmluZSBNUElfTU9ERV9ERUxFVEVfT05fQ0xPU0UgICAgMTYgIC8qIEFESU9fREVMRVRFX09OX0NMT1NFICovCi0jZGVmaW5lIE1QSV9NT0RFX1VOSVFVRV9PUEVOICAgICAgICAzMiAgLyogQURJT19VTklRVUVfT1BFTiAqLwotI2RlZmluZSBNUElfTU9ERV9FWENMICAgICAgICAgICAgICAgNjQgIC8qIEFESU9fRVhDTCAqLwotI2RlZmluZSBNUElfTU9ERV9BUFBFTkQgICAgICAgICAgICAxMjggIC8qIEFESU9fQVBQRU5EICovCi0jZGVmaW5lIE1QSV9NT0RFX1NFUVVFTlRJQUwgICAgICAgIDI1NiAgLyogQURJT19TRVFVRU5USUFMICovCi0KLSNkZWZpbmUgTVBJX0RJU1BMQUNFTUVOVF9DVVJSRU5UICAgLTU0Mjc4Mjc4Ci0KLSNkZWZpbmUgTVBJX1NFRUtfU0VUICAgICAgICAgICAgNjAwCi0jZGVmaW5lIE1QSV9TRUVLX0NVUiAgICAgICAgICAgIDYwMgotI2RlZmluZSBNUElfU0VFS19FTkQgICAgICAgICAgICA2MDQKLQotI2RlZmluZSBNUElfTUFYX0RBVEFSRVBfU1RSSU5HICAxMjgKLQotLyoKLSAqIE1QSS0yIE9uZS1TaWRlZCBDb21tdW5pY2F0aW9ucyBhc3NlcnRzCi0gKi8KLSNkZWZpbmUgTVBJX01PREVfTk9DSEVDSyAgICAgICAgICAgICAxCi0jZGVmaW5lIE1QSV9NT0RFX05PUFJFQ0VERSAgICAgICAgICAgMgotI2RlZmluZSBNUElfTU9ERV9OT1BVVCAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTVBJX01PREVfTk9TVE9SRSAgICAgICAgICAgICA4Ci0jZGVmaW5lIE1QSV9NT0RFX05PU1VDQ0VFRCAgICAgICAgICAxNgotCi0jZGVmaW5lIE1QSV9MT0NLX0VYQ0xVU0lWRSAgICAgICAgICAgMQotI2RlZmluZSBNUElfTE9DS19TSEFSRUQgICAgICAgICAgICAgIDIKLQotCi0vKgotICogUHJlZGVmaW5lZCBhdHRyaWJ1dGUga2V5dmFscwotICoKLSAqIERPIE5PVCBDSEFOR0UgVEhFIE9SREVSIFdJVEhPVVQgQUxTTyBDSEFOR0lORyBUSEUgT1JERVIgSU4KLSAqIHNyYy9hdHRyaWJ1dGUvYXR0cmlidXRlX3ByZWRlZmluZWQuYyBhbmQgbXBpZi5oLmluLgotICovCi1lbnVtIHsKLSAgICAvKiBNUEktMSAqLwotICAgIE1QSV9UQUdfVUIsCi0gICAgTVBJX0hPU1QsCi0gICAgTVBJX0lPLAotICAgIE1QSV9XVElNRV9JU19HTE9CQUwsCi0KLSAgICAvKiBNUEktMiAqLwotICAgIE1QSV9BUFBOVU0sCi0gICAgTVBJX0xBU1RVU0VEQ09ERSwKLSAgICBNUElfVU5JVkVSU0VfU0laRSwKLSAgICBNUElfV0lOX0JBU0UsCi0gICAgTVBJX1dJTl9TSVpFLAotICAgIE1QSV9XSU5fRElTUF9VTklULAotCi0gICAgLyogRXZlbiB0aG91Z2ggdGhlc2UgZm91ciBhcmUgSU1QSSBhdHRyaWJ1dGVzLCB0aGV5IG5lZWQgdG8gYmUgdGhlcmUKLSAgICAgICBmb3IgYWxsIE1QSSBqb2JzICovCi0gICAgSU1QSV9DTElFTlRfU0laRSwKLSAgICBJTVBJX0NMSUVOVF9DT0xPUiwKLSAgICBJTVBJX0hPU1RfU0laRSwKLSAgICBJTVBJX0hPU1RfQ09MT1IKLX07Ci0KLS8qCi0gKiBFcnJvciBjbGFzc2VzIGFuZCBjb2RlcwotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZXNlIHdpdGhvdXQgYWxzbyBtb2RpZnlpbmcgbXBpZi5oLmluLgotICovCi0jZGVmaW5lIE1QSV9TVUNDRVNTICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVBJX0VSUl9CVUZGRVIgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNUElfRVJSX0NPVU5UICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1QSV9FUlJfVFlQRSAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTVBJX0VSUl9UQUcgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBNUElfRVJSX0NPTU0gICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIE1QSV9FUlJfUkFOSyAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTVBJX0VSUl9SRVFVRVNUICAgICAgICAgICAgICAgNwotI2RlZmluZSBNUElfRVJSX1JPT1QgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIE1QSV9FUlJfR1JPVVAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgTVBJX0VSUl9PUCAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgTVBJX0VSUl9UT1BPTE9HWSAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgTVBJX0VSUl9ESU1TICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTVBJX0VSUl9BUkcgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgTVBJX0VSUl9VTktOT1dOICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgTVBJX0VSUl9UUlVOQ0FURSAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgTVBJX0VSUl9PVEhFUiAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgTVBJX0VSUl9JTlRFUk4gICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgTVBJX0VSUl9JTl9TVEFUVVMgICAgICAgICAgICAgMTgKLSNkZWZpbmUgTVBJX0VSUl9QRU5ESU5HICAgICAgICAgICAgICAgMTkKLSNkZWZpbmUgTVBJX0VSUl9BQ0NFU1MgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgTVBJX0VSUl9BTU9ERSAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgTVBJX0VSUl9BU1NFUlQgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgTVBJX0VSUl9CQURfRklMRSAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgTVBJX0VSUl9CQVNFICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgTVBJX0VSUl9DT05WRVJTSU9OICAgICAgICAgICAgMjUKLSNkZWZpbmUgTVBJX0VSUl9ESVNQICAgICAgICAgICAgICAgICAgMjYKLSNkZWZpbmUgTVBJX0VSUl9EVVBfREFUQVJFUCAgICAgICAgICAgMjcKLSNkZWZpbmUgTVBJX0VSUl9GSUxFX0VYSVNUUyAgICAgICAgICAgMjgKLSNkZWZpbmUgTVBJX0VSUl9GSUxFX0lOX1VTRSAgICAgICAgICAgMjkKLSNkZWZpbmUgTVBJX0VSUl9GSUxFICAgICAgICAgICAgICAgICAgMzAKLSNkZWZpbmUgTVBJX0VSUl9JTkZPX0tFWSAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgTVBJX0VSUl9JTkZPX05PS0VZICAgICAgICAgICAgMzIKLSNkZWZpbmUgTVBJX0VSUl9JTkZPX1ZBTFVFICAgICAgICAgICAgMzMKLSNkZWZpbmUgTVBJX0VSUl9JTkZPICAgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgTVBJX0VSUl9JTyAgICAgICAgICAgICAgICAgICAgMzUKLSNkZWZpbmUgTVBJX0VSUl9LRVlWQUwgICAgICAgICAgICAgICAgMzYKLSNkZWZpbmUgTVBJX0VSUl9MT0NLVFlQRSAgICAgICAgICAgICAgMzcKLSNkZWZpbmUgTVBJX0VSUl9OQU1FICAgICAgICAgICAgICAgICAgMzgKLSNkZWZpbmUgTVBJX0VSUl9OT19NRU0gICAgICAgICAgICAgICAgMzkKLSNkZWZpbmUgTVBJX0VSUl9OT1RfU0FNRSAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgTVBJX0VSUl9OT19TUEFDRSAgICAgICAgICAgICAgNDEKLSNkZWZpbmUgTVBJX0VSUl9OT19TVUNIX0ZJTEUgICAgICAgICAgNDIKLSNkZWZpbmUgTVBJX0VSUl9QT1JUICAgICAgICAgICAgICAgICAgNDMKLSNkZWZpbmUgTVBJX0VSUl9RVU9UQSAgICAgICAgICAgICAgICAgNDQKLSNkZWZpbmUgTVBJX0VSUl9SRUFEX09OTFkgICAgICAgICAgICAgNDUKLSNkZWZpbmUgTVBJX0VSUl9STUFfQ09ORkxJQ1QgICAgICAgICAgNDYKLSNkZWZpbmUgTVBJX0VSUl9STUFfU1lOQyAgICAgICAgICAgICAgNDcKLSNkZWZpbmUgTVBJX0VSUl9TRVJWSUNFICAgICAgICAgICAgICAgNDgKLSNkZWZpbmUgTVBJX0VSUl9TSVpFICAgICAgICAgICAgICAgICAgNDkKLSNkZWZpbmUgTVBJX0VSUl9TUEFXTiAgICAgICAgICAgICAgICAgNTAKLSNkZWZpbmUgTVBJX0VSUl9VTlNVUFBPUlRFRF9EQVRBUkVQICAgNTEKLSNkZWZpbmUgTVBJX0VSUl9VTlNVUFBPUlRFRF9PUEVSQVRJT04gNTIKLSNkZWZpbmUgTVBJX0VSUl9XSU4gICAgICAgICAgICAgICAgICAgNTMKLSNkZWZpbmUgTVBJX0VSUl9MQVNUQ09ERSAgICAgICAgICAgICAgNTQKLQotI2RlZmluZSBNUElfRVJSX1NZU1JFU09VUkNFICAgICAgICAgIC0yCi0KLQotLyoKLSAqIENvbXBhcmlzb24gcmVzdWx0cy4gIERvbid0IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UsIHRoZSBncm91cAotICogY29tcGFyaXNvbiBmdW5jdGlvbnMgcmVseSBvbiBpdC4KLSAqIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZXNlIHdpdGhvdXQgYWxzbyBtb2RpZnlpbmcgbXBpZi5oLmluLgotICovCi1lbnVtIHsKLSAgTVBJX0lERU5ULAotICBNUElfQ09OR1JVRU5ULAotICBNUElfU0lNSUxBUiwKLSAgTVBJX1VORVFVQUwKLX07Ci0KLS8qCi0gKiBNUElfSW5pdF90aHJlYWQgY29uc3RhbnRzCi0gKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSB3aXRob3V0IGFsc28gbW9kaWZ5aW5nIG1waWYuaC5pbi4KLSAqLwotZW51bSB7Ci0gIE1QSV9USFJFQURfU0lOR0xFLAotICBNUElfVEhSRUFEX0ZVTk5FTEVELAotICBNUElfVEhSRUFEX1NFUklBTElaRUQsCi0gIE1QSV9USFJFQURfTVVMVElQTEUKLX07Ci0KLS8qCi0gKiBEYXRhdHlwZSBjb21iaW5lcnMuCi0gKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSB3aXRob3V0IGFsc28gbW9kaWZ5aW5nIG1waWYuaC5pbi4KLSAqLwotZW51bSB7Ci0gIE1QSV9DT01CSU5FUl9OQU1FRCwKLSAgTVBJX0NPTUJJTkVSX0RVUCwKLSAgTVBJX0NPTUJJTkVSX0NPTlRJR1VPVVMsCi0gIE1QSV9DT01CSU5FUl9WRUNUT1IsCi0gIE1QSV9DT01CSU5FUl9IVkVDVE9SX0lOVEVHRVIsCi0gIE1QSV9DT01CSU5FUl9IVkVDVE9SLAotICBNUElfQ09NQklORVJfSU5ERVhFRCwKLSAgTVBJX0NPTUJJTkVSX0hJTkRFWEVEX0lOVEVHRVIsCi0gIE1QSV9DT01CSU5FUl9ISU5ERVhFRCwKLSAgTVBJX0NPTUJJTkVSX0lOREVYRURfQkxPQ0ssCi0gIE1QSV9DT01CSU5FUl9TVFJVQ1RfSU5URUdFUiwKLSAgTVBJX0NPTUJJTkVSX1NUUlVDVCwKLSAgTVBJX0NPTUJJTkVSX1NVQkFSUkFZLAotICBNUElfQ09NQklORVJfREFSUkFZLAotICBNUElfQ09NQklORVJfRjkwX1JFQUwsCi0gIE1QSV9DT01CSU5FUl9GOTBfQ09NUExFWCwKLSAgTVBJX0NPTUJJTkVSX0Y5MF9JTlRFR0VSLAotICBNUElfQ09NQklORVJfUkVTSVpFRAotfTsKLQotLyoKLSAqIE5VTEwgaGFuZGxlcwotICovCi0jZGVmaW5lIE1QSV9HUk9VUF9OVUxMICgmb21waV9tcGlfZ3JvdXBfbnVsbCkKLSNkZWZpbmUgTVBJX0NPTU1fTlVMTCAoJm9tcGlfbXBpX2NvbW1fbnVsbCkKLSNkZWZpbmUgTVBJX1JFUVVFU1RfTlVMTCAoJm9tcGlfcmVxdWVzdF9udWxsKQotI2RlZmluZSBNUElfT1BfTlVMTCAoJm9tcGlfbXBpX29wX251bGwpCi0jZGVmaW5lIE1QSV9FUlJIQU5ETEVSX05VTEwgKCZvbXBpX21waV9lcnJoYW5kbGVyX251bGwpCi0jZGVmaW5lIE1QSV9JTkZPX05VTEwgKCZvbXBpX21waV9pbmZvX251bGwpCi0jZGVmaW5lIE1QSV9XSU5fTlVMTCAoJm9tcGlfbXBpX3dpbl9udWxsKQotI2RlZmluZSBNUElfRklMRV9OVUxMICgmb21waV9tcGlfZmlsZV9udWxsKQotCi0jZGVmaW5lIE1QSV9TVEFUVVNfSUdOT1JFICgoTVBJX1N0YXR1cyAqKSAwKQotI2RlZmluZSBNUElfU1RBVFVTRVNfSUdOT1JFICgoTVBJX1N0YXR1cyAqKSAwKQotCi0vKiBNUEktMiBzcGVjaWZpZXMgdGhhdCB0aGUgbmFtZSAiTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4iIChhbmQgYWxsCi0gICByZWxhdGVkIGZyaWVuZHMpIG11c3QgYmUgYWNjZXNzaWJsZSBpbiBDLCBDKyssIGFuZCBGb3J0cmFuLiBUaGlzIGlzCi0gICB1bndvcmthYmxlIGlmIHRoZSBiYWNrLWVuZCBGb3J0cmFuIGNvbXBpbGVyIHVzZXMgYWxsIGNhcHMgZm9yIGl0cwotICAgbGlua2VyIHN5bWJvbCBjb252ZW50aW9uIC0tIGl0IHJlc3VsdHMgaW4gdHdvIGZ1bmN0aW9ucyB3aXRoCi0gICBkaWZmZXJlbnQgc2lnbmF0dXJlcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZSAoaS5lLiwgYm90aCBDIGFuZAotICAgRm9ydHJhbiB1c2UgdGhlIHN5bWJvbCBNUElfVFlQRV9OVUxMX0RFTEVURV9GTikuICBTbyB3ZSBoYXZlIHRvCi0gICAjZGVmaW5lIHRoZSBDIG5hbWVzIHRvIGJlIHNvbWV0aGluZyBlbHNlLCBzbyB0aGF0IHRoZXkgbmFtZXMgYXJlCi0gICAqYWNjZXNzZWQqIHRocm91Z2ggTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4sIGJ1dCB0aGVpciBhY3R1YWwgc3ltYm9sCi0gICBuYW1lIGlzIGRpZmZlcmVudC4KLQotICAgSG93ZXZlciwgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIHdoZW4gdGhlIGZvcnRyYW4gd3JhcHBlciBmdW5jdGlvbnMKLSAgIGFyZSBjb21waWxlZCBpbiBPcGVuIE1QSSwgc28gd2UgZG8gKm5vdCogd2FudCB0aGVzZSAjZGVmaW5lcyBpbgotICAgdGhpcyBjYXNlIChpLmUuLCB3ZSBuZWVkIHRoZSBGb3J0cmFuIHdyYXBwZXIgZnVuY3Rpb24gdG8gYmUKLSAgIGNvbXBpbGVkIGFzIE1QSV9UWVBFX05VTExfREVMRVRFX0ZOKS4gIFNvIGFkZCBzb21lICNpZiBraW5kcyBvZgotICAgcHJvdGVjdGlvbiBmb3IgdGhpcyBjYXNlLiAqLwotCi0jaWYgIWRlZmluZWQoT01QSV9DT01QSUxJTkdfRjc3X1dSQVBQRVJTKQotI2RlZmluZSBNUElfTlVMTF9ERUxFVEVfRk4gT01QSV9DX01QSV9OVUxMX0RFTEVURV9GTgotI2RlZmluZSBNUElfTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfTlVMTF9DT1BZX0ZOCi0jZGVmaW5lIE1QSV9EVVBfRk4gT01QSV9DX01QSV9EVVBfRk4KLQotI2RlZmluZSBNUElfVFlQRV9OVUxMX0RFTEVURV9GTiBPTVBJX0NfTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4KLSNkZWZpbmUgTVBJX1RZUEVfTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfVFlQRV9OVUxMX0NPUFlfRk4KLSNkZWZpbmUgTVBJX1RZUEVfRFVQX0ZOIE9NUElfQ19NUElfVFlQRV9EVVBfRk4KLQotI2RlZmluZSBNUElfQ09NTV9OVUxMX0RFTEVURV9GTiBPTVBJX0NfTVBJX0NPTU1fTlVMTF9ERUxFVEVfRk4KLSNkZWZpbmUgTVBJX0NPTU1fTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfQ09NTV9OVUxMX0NPUFlfRk4KLSNkZWZpbmUgTVBJX0NPTU1fRFVQX0ZOIE9NUElfQ19NUElfQ09NTV9EVVBfRk4KLQotI2RlZmluZSBNUElfV0lOX05VTExfREVMRVRFX0ZOIE9NUElfQ19NUElfV0lOX05VTExfREVMRVRFX0ZOCi0jZGVmaW5lIE1QSV9XSU5fTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfV0lOX05VTExfQ09QWV9GTgotI2RlZmluZSBNUElfV0lOX0RVUF9GTiBPTVBJX0NfTVBJX1dJTl9EVVBfRk4KLSNlbmRpZgotCi1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4oIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVfa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZXh0cmFfc3RhdGUgKTsKLU9NUElfREVDTFNQRUMgaW50IE9NUElfQ19NUElfVFlQRV9OVUxMX0NPUFlfRk4oIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGV4dHJhX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmbGFnICk7Ci1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX1RZUEVfRFVQX0ZOKCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9DT01NX05VTExfREVMRVRFX0ZOKCBNUElfQ29tbSBjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9DT01NX05VTExfQ09QWV9GTiggTVBJX0NvbW0gY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21tX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGV4dHJhX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmbGFnICk7Ci1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX0NPTU1fRFVQX0ZOKCBNUElfQ29tbSBjb21tLCBpbnQgY29tbV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9OVUxMX0RFTEVURV9GTiggTVBJX0NvbW0gY29tbSwgaW50IGNvbW1fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9OVUxMX0NPUFlfRk4oIE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9EVVBfRk4oIE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9XSU5fTlVMTF9ERUxFVEVfRk4oIE1QSV9XaW4gd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGV4dHJhX3N0YXRlICk7Ci1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX1dJTl9OVUxMX0NPUFlfRk4oIE1QSV9XaW4gd2luZG93LCBpbnQgd2luX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZXh0cmFfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZsYWcgKTsKLU9NUElfREVDTFNQRUMgaW50IE9NUElfQ19NUElfV0lOX0RVUF9GTiggTVBJX1dpbiB3aW5kb3csIGludCB3aW5fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotCi0KLS8qCi0gKiBFeHRlcm5hbCB2YXJpYWJsZXMKLSAqLwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfY29tbXVuaWNhdG9yX3Qgb21waV9tcGlfY29tbV93b3JsZDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2NvbW11bmljYXRvcl90IG9tcGlfbXBpX2NvbW1fc2VsZjsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2NvbW11bmljYXRvcl90IG9tcGlfbXBpX2NvbW1fbnVsbDsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZ3JvdXBfdCBvbXBpX21waV9ncm91cF9lbXB0eTsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2dyb3VwX3Qgb21waV9tcGlfZ3JvdXBfbnVsbDsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfcmVxdWVzdF90IG9tcGlfcmVxdWVzdF9udWxsOwotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX251bGw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX21heCwgb21waV9tcGlfb3BfbWluOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfb3BfdCBvbXBpX21waV9vcF9zdW0sIG9tcGlfbXBpX29wX3Byb2Q7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX2xhbmQsIG9tcGlfbXBpX29wX2JhbmQ7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX2xvciwgb21waV9tcGlfb3BfYm9yOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfb3BfdCBvbXBpX21waV9vcF9seG9yLCBvbXBpX21waV9vcF9ieG9yOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfb3BfdCBvbXBpX21waV9vcF9tYXhsb2MsIG9tcGlfbXBpX29wX21pbmxvYzsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX29wX3Qgb21waV9tcGlfb3BfcmVwbGFjZTsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9jaGFyLCBvbXBpX21waV9ieXRlOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnQsIG9tcGlfbXBpX2xvZ2ljOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9zaG9ydCwgb21waV9tcGlfbG9uZzsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfZmxvYXQsIG9tcGlfbXBpX2RvdWJsZTsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfbG9uZ19kb3VibGU7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2NwbGV4LCBvbXBpX21waV9wYWNrZWQ7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3NpZ25lZF9jaGFyOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV91bnNpZ25lZF9jaGFyOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV91bnNpZ25lZF9zaG9ydDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfdW5zaWduZWQsIG9tcGlfbXBpX2RhdGF0eXBlX251bGw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3Vuc2lnbmVkX2xvbmcsIG9tcGlfbXBpX2xkYmxjcGxleDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfdWIsIG9tcGlfbXBpX2xiOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9mbG9hdF9pbnQsIG9tcGlfbXBpX2RvdWJsZV9pbnQ7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2xvbmdfaW50LCBvbXBpX21waV8yaW50OwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9zaG9ydF9pbnQsIG9tcGlfbXBpX2RibGNwbGV4OwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyLCBvbXBpX21waV9yZWFsOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9kYmxwcmVjLCBvbXBpX21waV9jaGFyYWN0ZXI7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpXzJyZWFsLCBvbXBpX21waV8yZGJscHJlYzsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfMmludGVnZXIsIG9tcGlfbXBpX2xvbmdkYmxfaW50OwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV93Y2hhciwgb21waV9tcGlfbG9uZ19sb25nX2ludDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfdW5zaWduZWRfbG9uZ19sb25nOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9jeHhfY3BsZXgsIG9tcGlfbXBpX2N4eF9kYmxjcGxleDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfY3h4X2xkYmxjcGxleDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfY3h4X2Jvb2w7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpXzJjcGxleCwgb21waV9tcGlfMmRibGNwbGV4OwotLyogb3RoZXIgTVBJMiBkYXRhdHlwZXMgKi8KLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyMTsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVIyCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2ludGVnZXIyOwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjQKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfaW50ZWdlcjQ7Ci0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSOAotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyODsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVIxNgotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyMTY7Ci0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMNAotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9yZWFsNDsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw4Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3JlYWw4OwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDE2Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3JlYWwxNjsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw0Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2NvbXBsZXg4OwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDgKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfY29tcGxleDE2OwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDE2Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2NvbXBsZXgzMjsKLSNlbmRpZgotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9lcnJoYW5kbGVyX3Qgb21waV9tcGlfZXJyaGFuZGxlcl9udWxsOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZXJyaGFuZGxlcl90IG9tcGlfbXBpX2Vycm9yc19hcmVfZmF0YWw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9lcnJoYW5kbGVyX3Qgb21waV9tcGlfZXJyb3JzX3JldHVybjsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfd2luX3Qgb21waV9tcGlfd2luX251bGw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9maWxlX3Qgb21waV9tcGlfZmlsZV9udWxsOwotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9pbmZvX3Qgb21waV9tcGlfaW5mb19udWxsOwotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBNUElfRmludCAqTVBJX0ZfU1RBVFVTX0lHTk9SRTsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIE1QSV9GaW50ICpNUElfRl9TVEFUVVNFU19JR05PUkU7Ci0KLS8qCi0gKiBNUEkgcHJlZGVmaW5lZCBoYW5kbGVzCi0gKi8KLSNkZWZpbmUgTVBJX0NPTU1fV09STEQgKCZvbXBpX21waV9jb21tX3dvcmxkKQotI2RlZmluZSBNUElfQ09NTV9TRUxGICgmb21waV9tcGlfY29tbV9zZWxmKQotCi0jZGVmaW5lIE1QSV9HUk9VUF9FTVBUWSAoJm9tcGlfbXBpX2dyb3VwX2VtcHR5KQotCi0jZGVmaW5lIE1QSV9NQVggKCZvbXBpX21waV9vcF9tYXgpCi0jZGVmaW5lIE1QSV9NSU4gKCZvbXBpX21waV9vcF9taW4pCi0jZGVmaW5lIE1QSV9TVU0gKCZvbXBpX21waV9vcF9zdW0pCi0jZGVmaW5lIE1QSV9QUk9EICgmb21waV9tcGlfb3BfcHJvZCkKLSNkZWZpbmUgTVBJX0xBTkQgKCZvbXBpX21waV9vcF9sYW5kKQotI2RlZmluZSBNUElfQkFORCAoJm9tcGlfbXBpX29wX2JhbmQpCi0jZGVmaW5lIE1QSV9MT1IgKCZvbXBpX21waV9vcF9sb3IpCi0jZGVmaW5lIE1QSV9CT1IgKCZvbXBpX21waV9vcF9ib3IpCi0jZGVmaW5lIE1QSV9MWE9SICgmb21waV9tcGlfb3BfbHhvcikKLSNkZWZpbmUgTVBJX0JYT1IgKCZvbXBpX21waV9vcF9ieG9yKQotI2RlZmluZSBNUElfTUFYTE9DICgmb21waV9tcGlfb3BfbWF4bG9jKQotI2RlZmluZSBNUElfTUlOTE9DICgmb21waV9tcGlfb3BfbWlubG9jKQotI2RlZmluZSBNUElfUkVQTEFDRSAoJm9tcGlfbXBpX29wX3JlcGxhY2UpCi0KLS8qIEMgZGF0YXR5cGVzICovCi0jZGVmaW5lIE1QSV9EQVRBVFlQRV9OVUxMICgmb21waV9tcGlfZGF0YXR5cGVfbnVsbCkKLSNkZWZpbmUgTVBJX0JZVEUgKCZvbXBpX21waV9ieXRlKQotI2RlZmluZSBNUElfUEFDS0VEICgmb21waV9tcGlfcGFja2VkKQotI2RlZmluZSBNUElfQ0hBUiAoJm9tcGlfbXBpX2NoYXIpCi0jZGVmaW5lIE1QSV9TSE9SVCAoJm9tcGlfbXBpX3Nob3J0KQotI2RlZmluZSBNUElfSU5UICgmb21waV9tcGlfaW50KQotI2RlZmluZSBNUElfTE9ORyAoJm9tcGlfbXBpX2xvbmcpCi0jZGVmaW5lIE1QSV9GTE9BVCAoJm9tcGlfbXBpX2Zsb2F0KQotI2RlZmluZSBNUElfRE9VQkxFICgmb21waV9tcGlfZG91YmxlKQotI2RlZmluZSBNUElfTE9OR19ET1VCTEUgKCZvbXBpX21waV9sb25nX2RvdWJsZSkKLSNkZWZpbmUgTVBJX1VOU0lHTkVEX0NIQVIgKCZvbXBpX21waV91bnNpZ25lZF9jaGFyKQotI2RlZmluZSBNUElfU0lHTkVEX0NIQVIgKCZvbXBpX21waV9zaWduZWRfY2hhcikKLSNkZWZpbmUgTVBJX1VOU0lHTkVEX1NIT1JUICgmb21waV9tcGlfdW5zaWduZWRfc2hvcnQpCi0jZGVmaW5lIE1QSV9VTlNJR05FRF9MT05HICgmb21waV9tcGlfdW5zaWduZWRfbG9uZykKLSNkZWZpbmUgTVBJX1VOU0lHTkVEICgmb21waV9tcGlfdW5zaWduZWQpCi0jZGVmaW5lIE1QSV9GTE9BVF9JTlQgKCZvbXBpX21waV9mbG9hdF9pbnQpCi0jZGVmaW5lIE1QSV9ET1VCTEVfSU5UICgmb21waV9tcGlfZG91YmxlX2ludCkKLSNkZWZpbmUgTVBJX0xPTkdfRE9VQkxFX0lOVCAoJm9tcGlfbXBpX2xvbmdkYmxfaW50KQotI2RlZmluZSBNUElfTE9OR19JTlQgKCZvbXBpX21waV9sb25nX2ludCkKLSNkZWZpbmUgTVBJX1NIT1JUX0lOVCAoJm9tcGlfbXBpX3Nob3J0X2ludCkKLSNkZWZpbmUgTVBJXzJJTlQgKCZvbXBpX21waV8yaW50KQotI2RlZmluZSBNUElfVUIgKCZvbXBpX21waV91YikKLSNkZWZpbmUgTVBJX0xCICgmb21waV9tcGlfbGIpCi0jZGVmaW5lIE1QSV9XQ0hBUiAoJm9tcGlfbXBpX3djaGFyKQotI2lmIEhBVkVfTE9OR19MT05HCi0jZGVmaW5lIE1QSV9MT05HX0xPTkdfSU5UICgmb21waV9tcGlfbG9uZ19sb25nX2ludCkKLSNkZWZpbmUgTVBJX0xPTkdfTE9ORyAoJm9tcGlfbXBpX2xvbmdfbG9uZ19pbnQpCi0jZGVmaW5lIE1QSV9VTlNJR05FRF9MT05HX0xPTkcgKCZvbXBpX21waV91bnNpZ25lZF9sb25nX2xvbmcpCi0jZW5kaWYgIC8qIEhBVkVfTE9OR19MT05HICovCi0jZGVmaW5lIE1QSV8yQ09NUExFWCAoJm9tcGlfbXBpXzJjcGxleCkKLSNkZWZpbmUgTVBJXzJET1VCTEVfQ09NUExFWCAoJm9tcGlfbXBpXzJkYmxjcGxleCkKLQotLyogRm9ydHJhbiBkYXRhdHlwZSBiaW5kaW5ncyAqLwotI2RlZmluZSBNUElfQ0hBUkFDVEVSICgmb21waV9tcGlfY2hhcmFjdGVyKQotI2RlZmluZSBNUElfTE9HSUNBTCAoJm9tcGlfbXBpX2xvZ2ljKQotI2RlZmluZSBNUElfSU5URUdFUiAoJm9tcGlfbXBpX2ludGVnZXIpCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjEKLSNkZWZpbmUgTVBJX0lOVEVHRVIxICgmb21waV9tcGlfaW50ZWdlcjEpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMgotI2RlZmluZSBNUElfSU5URUdFUjIgKCZvbXBpX21waV9pbnRlZ2VyMikKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVI0Ci0jZGVmaW5lIE1QSV9JTlRFR0VSNCAoJm9tcGlfbXBpX2ludGVnZXI0KQotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjgKLSNkZWZpbmUgTVBJX0lOVEVHRVI4ICgmb21waV9tcGlfaW50ZWdlcjgpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMTYKLSNkZWZpbmUgTVBJX0lOVEVHRVIxNiAoJm9tcGlfbXBpX2ludGVnZXIxNikKLSNlbmRpZgotI2RlZmluZSBNUElfUkVBTCAoJm9tcGlfbXBpX3JlYWwpCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDQKLSNkZWZpbmUgTVBJX1JFQUw0ICgmb21waV9tcGlfcmVhbDQpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMOAotI2RlZmluZSBNUElfUkVBTDggKCZvbXBpX21waV9yZWFsOCkKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUwxNgotI2RlZmluZSBNUElfUkVBTDE2ICgmb21waV9tcGlfcmVhbDE2KQotI2VuZGlmCi0jZGVmaW5lIE1QSV9ET1VCTEVfUFJFQ0lTSU9OICgmb21waV9tcGlfZGJscHJlYykKLSNkZWZpbmUgTVBJX0NPTVBMRVggKCZvbXBpX21waV9jcGxleCkKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMNAotI2RlZmluZSBNUElfQ09NUExFWDggKCZvbXBpX21waV9jb21wbGV4OCkKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw4Ci0jZGVmaW5lIE1QSV9DT01QTEVYMTYgKCZvbXBpX21waV9jb21wbGV4MTYpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMMTYKLSNkZWZpbmUgTVBJX0NPTVBMRVgzMiAoJm9tcGlfbXBpX2NvbXBsZXgzMikKLSNlbmRpZgotI2RlZmluZSBNUElfRE9VQkxFX0NPTVBMRVggKCZvbXBpX21waV9kYmxjcGxleCkKLSNkZWZpbmUgTVBJXzJSRUFMICgmb21waV9tcGlfMnJlYWwpCi0jZGVmaW5lIE1QSV8yRE9VQkxFX1BSRUNJU0lPTiAoJm9tcGlfbXBpXzJkYmxwcmVjKQotI2RlZmluZSBNUElfMklOVEVHRVIgKCZvbXBpX21waV8yaW50ZWdlcikKLQotI2RlZmluZSBNUElfRVJST1JTX0FSRV9GQVRBTCAoJm9tcGlfbXBpX2Vycm9yc19hcmVfZmF0YWwpCi0jZGVmaW5lIE1QSV9FUlJPUlNfUkVUVVJOICgmb21waV9tcGlfZXJyb3JzX3JldHVybikKLQotLyogVHlwZWNsYXNzIGRlZmluaXRpb24gZm9yIE1QSV9UeXBlX21hdGNoX3NpemUgKi8KLSNkZWZpbmUgTVBJX1RZUEVDTEFTU19JTlRFR0VSICAgIDEKLSNkZWZpbmUgTVBJX1RZUEVDTEFTU19SRUFMICAgICAgIDIKLSNkZWZpbmUgTVBJX1RZUEVDTEFTU19DT01QTEVYICAgIDMKLQotLyoKLSAqIEZvciBhcHBsaWNhdGlvbnMgc3RpbGwgdXNpbmcgdGhlIG9sZCBbbm9uLXN0YW5kYXJkXSBST01JTyBjb252ZW50aW9ucwotICovCi0jZGVmaW5lIE1QSU9fUmVxdWVzdCBNUElfUmVxdWVzdAotI2RlZmluZSBNUElPX1Rlc3QgTVBJX1Rlc3QKLSNkZWZpbmUgTVBJT19XYWl0IE1QSV9XYWl0Ci0KLQotLyoKLSAqIE1QSSBBUEkKLSAqLwotCi1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0Fib3J0KE1QSV9Db21tIGNvbW0sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BY2N1bXVsYXRlKHZvaWQgKm9yaWdpbl9hZGRyLCBpbnQgb3JpZ2luX2NvdW50LCBNUElfRGF0YXR5cGUgb3JpZ2luX2RhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRfcmFuaywgTVBJX0FpbnQgdGFyZ2V0X2Rpc3AsIGludCB0YXJnZXRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX09wIG9wLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FkZF9lcnJvcl9jbGFzcyhpbnQgKmVycm9yY2xhc3MpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BZGRfZXJyb3JfY29kZShpbnQgZXJyb3JjbGFzcywgaW50ICplcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BZGRfZXJyb3Jfc3RyaW5nKGludCBlcnJvcmNvZGUsIGNoYXIgKnN0cmluZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FkZHJlc3Modm9pZCAqbG9jYXRpb24sIE1QSV9BaW50ICphZGRyZXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQWxsZ2F0aGVyKHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BbGxnYXRoZXJ2KHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXNwbHMsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbG9jX21lbShNUElfQWludCBzaXplLCBNUElfSW5mbyBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZXB0cik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbHJlZHVjZSh2b2lkICpzZW5kYnVmLCB2b2lkICpyZWN2YnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9PcCBvcCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbHRvYWxsKHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQWxsdG9hbGx2KHZvaWQgKnNlbmRidWYsIGludCAqc2VuZGNvdW50cywgaW50ICpzZGlzcGxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLCB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJkaXNwbHMsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbHRvYWxsdyh2b2lkICpzZW5kYnVmLCBpbnQgKnNlbmRjb3VudHMsIGludCAqc2Rpc3BscywgTVBJX0RhdGF0eXBlICpzZW5kdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsIGludCAqcmRpc3BscywgTVBJX0RhdGF0eXBlICpyZWN2dHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQXR0cl9kZWxldGUoTVBJX0NvbW0gY29tbSwgaW50IGtleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0F0dHJfZ2V0KE1QSV9Db21tIGNvbW0sIGludCBrZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0F0dHJfcHV0KE1QSV9Db21tIGNvbW0sIGludCBrZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9CYXJyaWVyKE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9CY2FzdCh2b2lkICpidWZmZXIsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0JzZW5kKHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQnNlbmRfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0J1ZmZlcl9hdHRhY2godm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0J1ZmZlcl9kZXRhY2godm9pZCAqYnVmZmVyLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9DYW5jZWwoTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9DYXJ0X2Nvb3JkcyhNUElfQ29tbSBjb21tLCBpbnQgcmFuaywgaW50IG1heGRpbXMsIGludCAqY29vcmRzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ2FydF9jcmVhdGUoTVBJX0NvbW0gb2xkX2NvbW0sIGludCBuZGltcywgaW50ICpkaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBlcmlvZHMsIGludCByZW9yZGVyLCBNUElfQ29tbSAqY29tbV9jYXJ0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ2FydF9nZXQoTVBJX0NvbW0gY29tbSwgaW50IG1heGRpbXMsIGludCAqZGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwZXJpb2RzLCBpbnQgKmNvb3Jkcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRfbWFwKE1QSV9Db21tIGNvbW0sIGludCBuZGltcywgaW50ICpkaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBlcmlvZHMsIGludCAqbmV3cmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRfcmFuayhNUElfQ29tbSBjb21tLCBpbnQgKmNvb3JkcywgaW50ICpyYW5rKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ2FydF9zaGlmdChNUElfQ29tbSBjb21tLCBpbnQgZGlyZWN0aW9uLCBpbnQgZGlzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJhbmtfc291cmNlLCBpbnQgKnJhbmtfZGVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRfc3ViKE1QSV9Db21tIGNvbW0sIGludCAqcmVtYWluX2RpbXMsIE1QSV9Db21tICpuZXdfY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRkaW1fZ2V0KE1QSV9Db21tIGNvbW0sIGludCAqbmRpbXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9DbG9zZV9wb3J0KGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fYWNjZXB0KGNoYXIgKnBvcnRfbmFtZSwgTVBJX0luZm8gaW5mbywgaW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGNvbW0sIE1QSV9Db21tICpuZXdjb21tKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IE1QSV9Db21tX2MyZihNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9jYWxsX2VycmhhbmRsZXIoTVBJX0NvbW0gY29tbSwgaW50IGVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fY29tcGFyZShNUElfQ29tbSBjb21tMSwgTVBJX0NvbW0gY29tbTIsIGludCAqcmVzdWx0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9jb25uZWN0KGNoYXIgKnBvcnRfbmFtZSwgTVBJX0luZm8gaW5mbywgaW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fY3JlYXRlX2VycmhhbmRsZXIoTVBJX0NvbW1fZXJyaGFuZGxlcl9mbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2NyZWF0ZV9rZXl2YWwoTVBJX0NvbW1fY29weV9hdHRyX2Z1bmN0aW9uICpjb21tX2NvcHlfYXR0cl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tX2RlbGV0ZV9hdHRyX2Z1bmN0aW9uICpjb21tX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb21tX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2NyZWF0ZShNUElfQ29tbSBjb21tLCBNUElfR3JvdXAgZ3JvdXAsIE1QSV9Db21tICpuZXdjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9kZWxldGVfYXR0cihNUElfQ29tbSBjb21tLCBpbnQgY29tbV9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2Rpc2Nvbm5lY3QoTVBJX0NvbW0gKmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2R1cChNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfQ29tbSBNUElfQ29tbV9mMmMoTVBJX0ZpbnQgY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZnJlZV9rZXl2YWwoaW50ICpjb21tX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZnJlZShNUElfQ29tbSAqY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X2F0dHIoTVBJX0NvbW0gY29tbSwgaW50IGNvbW1fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X2VycmhhbmRsZXIoTVBJX0NvbW0gY29tbSwgTVBJX0VycmhhbmRsZXIgKmVyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X25hbWUoTVBJX0NvbW0gY29tbSwgY2hhciAqY29tbV9uYW1lLCBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X3BhcmVudChNUElfQ29tbSAqcGFyZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9ncm91cChNUElfQ29tbSBjb21tLCBNUElfR3JvdXAgKmdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9qb2luKGludCBmZCwgTVBJX0NvbW0gKmludGVyY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fcmFuayhNUElfQ29tbSBjb21tLCBpbnQgKnJhbmspOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3JlbW90ZV9ncm91cChNUElfQ29tbSBjb21tLCBNUElfR3JvdXAgKmdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9yZW1vdGVfc2l6ZShNUElfQ29tbSBjb21tLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3NldF9hdHRyKE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwgdm9pZCAqYXR0cmlidXRlX3ZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fc2V0X2VycmhhbmRsZXIoTVBJX0NvbW0gY29tbSwgTVBJX0VycmhhbmRsZXIgZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fc2V0X25hbWUoTVBJX0NvbW0gY29tbSwgY2hhciAqY29tbV9uYW1lKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9zaXplKE1QSV9Db21tIGNvbW0sIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fc3Bhd24oY2hhciAqY29tbWFuZCwgY2hhciAqKmFyZ3YsIGludCBtYXhwcm9jcywgTVBJX0luZm8gaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKmludGVyY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFycmF5X29mX2VycmNvZGVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9zcGF3bl9tdWx0aXBsZShpbnQgY291bnQsIGNoYXIgKiphcnJheV9vZl9jb21tYW5kcywgY2hhciAqKiphcnJheV9vZl9hcmd2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYXJyYXlfb2ZfbWF4cHJvY3MsIE1QSV9JbmZvICphcnJheV9vZl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqaW50ZXJjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYXJyYXlfb2ZfZXJyY29kZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3NwbGl0KE1QSV9Db21tIGNvbW0sIGludCBjb2xvciwgaW50IGtleSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3Rlc3RfaW50ZXIoTVBJX0NvbW0gY29tbSwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRGltc19jcmVhdGUoaW50IG5ub2RlcywgaW50IG5kaW1zLCBpbnQgKmRpbXMpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX0VycmhhbmRsZXJfYzJmKE1QSV9FcnJoYW5kbGVyIGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9FcnJoYW5kbGVyX2NyZWF0ZShNUElfSGFuZGxlcl9mdW5jdGlvbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIE1QSV9FcnJoYW5kbGVyIE1QSV9FcnJoYW5kbGVyX2YyYyhNUElfRmludCBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyaGFuZGxlcl9mcmVlKE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyaGFuZGxlcl9nZXQoTVBJX0NvbW0gY29tbSwgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9FcnJoYW5kbGVyX3NldChNUElfQ29tbSBjb21tLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyb3JfY2xhc3MoaW50IGVycm9yY29kZSwgaW50ICplcnJvcmNsYXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyb3Jfc3RyaW5nKGludCBlcnJvcmNvZGUsIGNoYXIgKnN0cmluZywgaW50ICpyZXN1bHRsZW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9FeHNjYW4odm9pZCAqc2VuZGJ1Ziwgdm9pZCAqcmVjdmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX0ZpbGVfYzJmKE1QSV9GaWxlIGZpbGUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbGUgTVBJX0ZpbGVfZjJjKE1QSV9GaW50IGZpbGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2NhbGxfZXJyaGFuZGxlcihNUElfRmlsZSBmaCwgaW50IGVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfY3JlYXRlX2VycmhhbmRsZXIoTVBJX0ZpbGVfZXJyaGFuZGxlcl9mbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NldF9lcnJoYW5kbGVyKCBNUElfRmlsZSBmaWxlLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfZXJyaGFuZGxlciggTVBJX0ZpbGUgZmlsZSwgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX29wZW4oTVBJX0NvbW0gY29tbSwgY2hhciAqZmlsZW5hbWUsIGludCBhbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9JbmZvIGluZm8sIE1QSV9GaWxlICpmaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfY2xvc2UoTVBJX0ZpbGUgKmZoKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9kZWxldGUoY2hhciAqZmlsZW5hbWUsIE1QSV9JbmZvIGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NldF9zaXplKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IHNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3ByZWFsbG9jYXRlKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IHNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2dldF9zaXplKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfZ3JvdXAoTVBJX0ZpbGUgZmgsIE1QSV9Hcm91cCAqZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2dldF9hbW9kZShNUElfRmlsZSBmaCwgaW50ICphbW9kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfc2V0X2luZm8oTVBJX0ZpbGUgZmgsIE1QSV9JbmZvIGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2dldF9pbmZvKE1QSV9GaWxlIGZoLCBNUElfSW5mbyAqaW5mb191c2VkKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9zZXRfdmlldyhNUElfRmlsZSBmaCwgTVBJX09mZnNldCBkaXNwLCBNUElfRGF0YXR5cGUgZXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGZpbGV0eXBlLCBjaGFyICpkYXRhcmVwLCBNUElfSW5mbyBpbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfdmlldyhNUElfRmlsZSBmaCwgTVBJX09mZnNldCAqZGlzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKmV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqZmlsZXR5cGUsIGNoYXIgKmRhdGFyZXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWRfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX2F0X2FsbChNUElfRmlsZSBmaCwgTVBJX09mZnNldCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdChNUElfRmlsZSBmaCwgTVBJX09mZnNldCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdF9hbGwoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2lyZWFkX2F0KE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXdyaXRlX2F0KE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWRfYWxsKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGUoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hbGwoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXJlYWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2l3cml0ZShNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NlZWsoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfcG9zaXRpb24oTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgKm9mZnNldCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfZ2V0X2J5dGVfb2Zmc2V0KE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX09mZnNldCAqZGlzcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXJlYWRfc2hhcmVkKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXdyaXRlX3NoYXJlZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX29yZGVyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfc2Vla19zaGFyZWQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfcG9zaXRpb25fc2hhcmVkKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0ICpvZmZzZXQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWRfYXRfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX2F0X2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdF9hbGxfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9hbGxfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGVfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hbGxfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9vcmRlcmVkX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX29yZGVyZWRfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZF9iZWdpbihNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3dyaXRlX29yZGVyZWRfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfZ2V0X3R5cGVfZXh0ZW50KE1QSV9GaWxlIGZoLCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50ICpleHRlbnQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NldF9hdG9taWNpdHkoTVBJX0ZpbGUgZmgsIGludCBmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfYXRvbWljaXR5KE1QSV9GaWxlIGZoLCBpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3N5bmMoTVBJX0ZpbGUgZmgpOwotLyoKLSAqIGZpbGUgZnVuY3Rpb25zIGVuZAotICovCi1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbmFsaXplKHZvaWQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaW5hbGl6ZWQoaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRnJlZV9tZW0odm9pZCAqYmFzZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dhdGhlcih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgcmVjdmNvdW50LCBNUElfRGF0YXR5cGUgcmVjdnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dhdGhlcnYodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCAqcmVjdmNvdW50cywgaW50ICpkaXNwbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldF9hZGRyZXNzKHZvaWQgKmxvY2F0aW9uLCBNUElfQWludCAqYWRkcmVzcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldF9jb3VudChNUElfU3RhdHVzICpzdGF0dXMsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50ICpjb3VudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldF9lbGVtZW50cyhNUElfU3RhdHVzICpzdGF0dXMsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50ICpjb3VudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldCh2b2lkICpvcmlnaW5fYWRkciwgaW50IG9yaWdpbl9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsIGludCB0YXJnZXRfcmFuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IHRhcmdldF9kaXNwLCBpbnQgdGFyZ2V0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HZXRfcHJvY2Vzc29yX25hbWUoY2hhciAqbmFtZSwgaW50ICpyZXN1bHRsZW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HZXRfdmVyc2lvbihpbnQgKnZlcnNpb24sIGludCAqc3VidmVyc2lvbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyYXBoX2NyZWF0ZShNUElfQ29tbSBjb21tX29sZCwgaW50IG5ub2RlcywgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZWRnZXMsIGludCByZW9yZGVyLCBNUElfQ29tbSAqY29tbV9ncmFwaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyYXBoX2dldChNUElfQ29tbSBjb21tLCBpbnQgbWF4aW5kZXgsIGludCBtYXhlZGdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIGludCAqZWRnZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HcmFwaF9tYXAoTVBJX0NvbW0gY29tbSwgaW50IG5ub2RlcywgaW50ICppbmRleCwgaW50ICplZGdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmV3cmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyYXBoX25laWdoYm9yc19jb3VudChNUElfQ29tbSBjb21tLCBpbnQgcmFuaywgaW50ICpubmVpZ2hib3JzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JhcGhfbmVpZ2hib3JzKE1QSV9Db21tIGNvbW0sIGludCByYW5rLCBpbnQgbWF4bmVpZ2hib3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuZWlnaGJvcnMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HcmFwaGRpbXNfZ2V0KE1QSV9Db21tIGNvbW0sIGludCAqbm5vZGVzLCBpbnQgKm5lZGdlcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyZXF1ZXN0X2NvbXBsZXRlKE1QSV9SZXF1ZXN0IHJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HcmVxdWVzdF9zdGFydChNUElfR3JlcXVlc3RfcXVlcnlfZnVuY3Rpb24gKnF1ZXJ5X2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JlcXVlc3RfZnJlZV9mdW5jdGlvbiAqZnJlZV9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyZXF1ZXN0X2NhbmNlbF9mdW5jdGlvbiAqY2FuY2VsX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYV9zdGF0ZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX0dyb3VwX2MyZihNUElfR3JvdXAgZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Hcm91cF9jb21wYXJlKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsIGludCAqcmVzdWx0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfZGlmZmVyZW5jZShNUElfR3JvdXAgZ3JvdXAxLCBNUElfR3JvdXAgZ3JvdXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Hcm91cF9leGNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCAqcmFua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfR3JvdXAgTVBJX0dyb3VwX2YyYyhNUElfRmludCBncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX2ZyZWUoTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX2luY2woTVBJX0dyb3VwIGdyb3VwLCBpbnQgbiwgaW50ICpyYW5rcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgKm5ld2dyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfaW50ZXJzZWN0aW9uKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgKm5ld2dyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfcmFuZ2VfZXhjbChNUElfR3JvdXAgZ3JvdXAsIGludCBuLCBpbnQgcmFuZ2VzW11bM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX3JhbmdlX2luY2woTVBJX0dyb3VwIGdyb3VwLCBpbnQgbiwgaW50IHJhbmdlc1tdWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Hcm91cF9yYW5rKE1QSV9Hcm91cCBncm91cCwgaW50ICpyYW5rKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfc2l6ZShNUElfR3JvdXAgZ3JvdXAsIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX3RyYW5zbGF0ZV9yYW5rcyhNUElfR3JvdXAgZ3JvdXAxLCBpbnQgbiwgaW50ICpyYW5rczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgZ3JvdXAyLCBpbnQgKnJhbmtzMik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX3VuaW9uKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JYnNlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRmludCBNUElfSW5mb19jMmYoTVBJX0luZm8gaW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luZm9fY3JlYXRlKE1QSV9JbmZvICppbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW5mb19kZWxldGUoTVBJX0luZm8gaW5mbywgY2hhciAqa2V5KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW5mb19kdXAoTVBJX0luZm8gaW5mbywgTVBJX0luZm8gKm5ld2luZm8pOwotT01QSV9ERUNMU1BFQyAgTVBJX0luZm8gTVBJX0luZm9fZjJjKE1QSV9GaW50IGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JbmZvX2ZyZWUoTVBJX0luZm8gKmluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JbmZvX2dldChNUElfSW5mbyBpbmZvLCBjaGFyICprZXksIGludCB2YWx1ZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdmFsdWUsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luZm9fZ2V0X25rZXlzKE1QSV9JbmZvIGluZm8sIGludCAqbmtleXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JbmZvX2dldF9udGhrZXkoTVBJX0luZm8gaW5mbywgaW50IG4sIGNoYXIgKmtleSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luZm9fZ2V0X3ZhbHVlbGVuKE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSwgaW50ICp2YWx1ZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW5mb19zZXQoTVBJX0luZm8gaW5mbywgY2hhciAqa2V5LCBjaGFyICp2YWx1ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luaXQoaW50ICphcmdjLCBjaGFyICoqKmFyZ3YpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jbml0aWFsaXplZChpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jbml0X3RocmVhZChpbnQgKmFyZ2MsIGNoYXIgKioqYXJndiwgaW50IHJlcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnByb3ZpZGVkKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW50ZXJjb21tX2NyZWF0ZShNUElfQ29tbSBsb2NhbF9jb21tLCBpbnQgbG9jYWxfbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGJyaWRnZV9jb21tLCBpbnQgcmVtb3RlX2xlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSAqbmV3aW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW50ZXJjb21tX21lcmdlKE1QSV9Db21tIGludGVyY29tbSwgaW50IGhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSAqbmV3aW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSXByb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0lyZWN2KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSXJzZW5kKHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jc3NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0lzX3RocmVhZF9tYWluKGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0tleXZhbF9jcmVhdGUoTVBJX0NvcHlfZnVuY3Rpb24gKmNvcHlfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RlbGV0ZV9mdW5jdGlvbiAqZGVsZXRlX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqa2V5dmFsLCB2b2lkICpleHRyYV9zdGF0ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0tleXZhbF9mcmVlKGludCAqa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfTG9va3VwX25hbWUoY2hhciAqc2VydmljZV9uYW1lLCBNUElfSW5mbyBpbmZvLCBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX09wX2MyZihNUElfT3Agb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9PcF9jcmVhdGUoTVBJX1VzZXJfZnVuY3Rpb24gKmZ1bmN0aW9uLCBpbnQgY29tbXV0ZSwgTVBJX09wICpvcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX09wZW5fcG9ydChNUElfSW5mbyBpbmZvLCBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgTVBJX09wIE1QSV9PcF9mMmMoTVBJX0ZpbnQgb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9PcF9mcmVlKE1QSV9PcCAqb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QYWNrX2V4dGVybmFsKGNoYXIgKmRhdGFyZXAsIHZvaWQgKmluYnVmLCBpbnQgaW5jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIHZvaWQgKm91dGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCBvdXRzaXplLCBNUElfQWludCAqcG9zaXRpb24pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QYWNrX2V4dGVybmFsX3NpemUoY2hhciAqZGF0YXJlcCwgaW50IGluY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9BaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfUGFjayh2b2lkICppbmJ1ZiwgaW50IGluY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRidWYsIGludCBvdXRzaXplLCBpbnQgKnBvc2l0aW9uLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfUGFja19zaXplKGludCBpbmNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QY29udHJvbChjb25zdCBpbnQgbGV2ZWwsIC4uLik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1Byb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1B1Ymxpc2hfbmFtZShjaGFyICpzZXJ2aWNlX25hbWUsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QdXQodm9pZCAqb3JpZ2luX2FkZHIsIGludCBvcmlnaW5fY291bnQsIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0X3JhbmssIE1QSV9BaW50IHRhcmdldF9kaXNwLCBpbnQgdGFyZ2V0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9RdWVyeV90aHJlYWQoaW50ICpwcm92aWRlZCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlY3ZfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9SZWN2KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfUmVkdWNlKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX09wIG9wLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlZHVjZV9zY2F0dGVyKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCAqcmVjdmNvdW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9SZWdpc3Rlcl9kYXRhcmVwKGNoYXIgKmRhdGFyZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfY29udmVyc2lvbl9mdW5jdGlvbiAqcmVhZF9jb252ZXJzaW9uX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhcmVwX2NvbnZlcnNpb25fZnVuY3Rpb24gKndyaXRlX2NvbnZlcnNpb25fZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfZXh0ZW50X2Z1bmN0aW9uICpkdHlwZV9maWxlX2V4dGVudF9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYV9zdGF0ZSk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRmludCBNUElfUmVxdWVzdF9jMmYoTVBJX1JlcXVlc3QgcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfUmVxdWVzdCBNUElfUmVxdWVzdF9mMmMoTVBJX0ZpbnQgcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlcXVlc3RfZnJlZShNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlcXVlc3RfZ2V0X3N0YXR1cyhNUElfUmVxdWVzdCByZXF1ZXN0LCBpbnQgKmZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Sc2VuZCh2b2lkICppYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Sc2VuZF9pbml0KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9TY2FuKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9PcCBvcCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NjYXR0ZXIodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NjYXR0ZXJ2KHZvaWQgKnNlbmRidWYsIGludCAqc2VuZGNvdW50cywgaW50ICpkaXNwbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NlbmRfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NlbmRyZWN2KHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCBzZW5kdGFnLCB2b2lkICpyZWN2YnVmLCBpbnQgcmVjdmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tLCAgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfU2VuZHJlY3ZfcmVwbGFjZSh2b2lkICogYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHNlbmR0YWcsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NzZW5kX2luaXQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHRhZywgTVBJX0NvbW0gY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NzZW5kKHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfU3RhcnQoTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9TdGFydGFsbChpbnQgY291bnQsIE1QSV9SZXF1ZXN0ICphcnJheV9vZl9yZXF1ZXN0cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1N0YXR1c19jMmYoTVBJX1N0YXR1cyAqY19zdGF0dXMsIE1QSV9GaW50ICpmX3N0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1N0YXR1c19mMmMoTVBJX0ZpbnQgKmZfc3RhdHVzLCBNUElfU3RhdHVzICpjX3N0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1N0YXR1c19zZXRfY2FuY2VsbGVkKE1QSV9TdGF0dXMgKnN0YXR1cywgaW50IGZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9TdGF0dXNfc2V0X2VsZW1lbnRzKE1QSV9TdGF0dXMgKnN0YXR1cywgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1Rlc3RhbGwoaW50IGNvdW50LCBNUElfUmVxdWVzdCBhcnJheV9vZl9yZXF1ZXN0c1tdLCBpbnQgKmZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyBhcnJheV9vZl9zdGF0dXNlc1tdKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVGVzdGFueShpbnQgY291bnQsIE1QSV9SZXF1ZXN0IGFycmF5X29mX3JlcXVlc3RzW10sIGludCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmbGFnLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UZXN0KE1QSV9SZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgKmZsYWcsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1Rlc3RfY2FuY2VsbGVkKE1QSV9TdGF0dXMgKnN0YXR1cywgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVGVzdHNvbWUoaW50IGluY291bnQsIE1QSV9SZXF1ZXN0IGFycmF5X29mX3JlcXVlc3RzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0Y291bnQsIGludCBhcnJheV9vZl9pbmRpY2VzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9TdGF0dXMgYXJyYXlfb2Zfc3RhdHVzZXNbXSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1RvcG9fdGVzdChNUElfQ29tbSBjb21tLCBpbnQgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRmludCBNUElfVHlwZV9jMmYoTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jb21taXQoTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jb250aWd1b3VzKGludCBjb3VudCwgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2NyZWF0ZV9kYXJyYXkoaW50IHNpemUsIGludCByYW5rLCBpbnQgbmRpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3NpemVfYXJyYXlbXSwgaW50IGRpc3RyaWJfYXJyYXlbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXJnX2FycmF5W10sIGludCBwc2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfY3JlYXRlX2Y5MF9jb21wbGV4KGludCBwLCBpbnQgciwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfZjkwX2ludGVnZXIoaW50IHIsIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfY3JlYXRlX2Y5MF9yZWFsKGludCBwLCBpbnQgciwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfY3JlYXRlX2h2ZWN0b3IoaW50IGNvdW50LCBpbnQgYmxvY2tsZW5ndGgsIE1QSV9BaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2NyZWF0ZV9rZXl2YWwoTVBJX1R5cGVfY29weV9hdHRyX2Z1bmN0aW9uICp0eXBlX2NvcHlfYXR0cl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9UeXBlX2RlbGV0ZV9hdHRyX2Z1bmN0aW9uICp0eXBlX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2NyZWF0ZV9pbmRleGVkX2Jsb2NrKGludCBjb3VudCwgaW50IGJsb2NrbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheV9vZl9kaXNwbGFjZW1lbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfc3RydWN0KGludCBjb3VudCwgaW50IGFycmF5X29mX2Jsb2NrX2xlbmd0aHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBhcnJheV9vZl90eXBlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfc3ViYXJyYXkoaW50IG5kaW1zLCBpbnQgc2l6ZV9hcnJheVtdLCBpbnQgc3Vic2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYXJyYXlbXSwgaW50IG9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfcmVzaXplZChNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0FpbnQgbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgZXh0ZW50LCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2RlbGV0ZV9hdHRyKE1QSV9EYXRhdHlwZSB0eXBlLCBpbnQgdHlwZV9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2R1cChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9leHRlbnQoTVBJX0RhdGF0eXBlIHR5cGUsIE1QSV9BaW50ICpleHRlbnQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2ZyZWUoTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9mcmVlX2tleXZhbChpbnQgKnR5cGVfa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIE1QSV9EYXRhdHlwZSBNUElfVHlwZV9mMmMoTVBJX0ZpbnQgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2dldF9hdHRyKE1QSV9EYXRhdHlwZSB0eXBlLCBpbnQgdHlwZV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cmlidXRlX3ZhbCwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9nZXRfY29udGVudHMoTVBJX0RhdGF0eXBlIG10eXBlLCBpbnQgbWF4X2ludGVnZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2FkZHJlc3NlcywgaW50IG1heF9kYXRhdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheV9vZl9pbnRlZ2Vyc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCBhcnJheV9vZl9hZGRyZXNzZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGFycmF5X29mX2RhdGF0eXBlc1tdKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9nZXRfZW52ZWxvcGUoTVBJX0RhdGF0eXBlIHR5cGUsIGludCAqbnVtX2ludGVnZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV9hZGRyZXNzZXMsIGludCAqbnVtX2RhdGF0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb21iaW5lcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfZ2V0X2V4dGVudChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0FpbnQgKmxiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgKmV4dGVudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfZ2V0X25hbWUoTVBJX0RhdGF0eXBlIHR5cGUsIGNoYXIgKnR5cGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfZ2V0X3RydWVfZXh0ZW50KE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX0FpbnQgKnRydWVfbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50ICp0cnVlX2V4dGVudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2h2ZWN0b3IoaW50IGNvdW50LCBpbnQgYmxvY2tsZW5ndGgsIE1QSV9BaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2luZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfbGIoTVBJX0RhdGF0eXBlIHR5cGUsIE1QSV9BaW50ICpsYik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfbWF0Y2hfc2l6ZShpbnQgdHlwZWNsYXNzLCBpbnQgc2l6ZSwgTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9zZXRfYXR0cihNUElfRGF0YXR5cGUgdHlwZSwgaW50IHR5cGVfa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmF0dHJfdmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9zZXRfbmFtZShNUElfRGF0YXR5cGUgdHlwZSwgY2hhciAqdHlwZV9uYW1lKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9zaXplKE1QSV9EYXRhdHlwZSB0eXBlLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX3N0cnVjdChpbnQgY291bnQsIGludCBhcnJheV9vZl9ibG9ja2xlbmd0aHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgYXJyYXlfb2ZfdHlwZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV91YihNUElfRGF0YXR5cGUgbXR5cGUsIE1QSV9BaW50ICp1Yik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfdmVjdG9yKGludCBjb3VudCwgaW50IGJsb2NrbGVuZ3RoLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVW5wYWNrKHZvaWQgKmluYnVmLCBpbnQgaW5zaXplLCBpbnQgKnBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmLCBpbnQgb3V0Y291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9VbnB1Ymxpc2hfbmFtZShjaGFyICpzZXJ2aWNlX25hbWUsIE1QSV9JbmZvIGluZm8sIGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1VucGFja19leHRlcm5hbCAoY2hhciAqZGF0YXJlcCwgdm9pZCAqaW5idWYsIE1QSV9BaW50IGluc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCAqcG9zaXRpb24sIHZvaWQgKm91dGJ1ZiwgaW50IG91dGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dhaXRhbGwoaW50IGNvdW50LCBNUElfUmVxdWVzdCAqYXJyYXlfb2ZfcmVxdWVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XYWl0YW55KGludCBjb3VudCwgTVBJX1JlcXVlc3QgKmFycmF5X29mX3JlcXVlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dhaXQoTVBJX1JlcXVlc3QgKnJlcXVlc3QsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dhaXRzb21lKGludCBpbmNvdW50LCBNUElfUmVxdWVzdCAqYXJyYXlfb2ZfcmVxdWVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0Y291bnQsIGludCAqYXJyYXlfb2ZfaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX1dpbl9jMmYoTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fY2FsbF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBpbnQgZXJyb3Jjb2RlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2NvbXBsZXRlKE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2NyZWF0ZSh2b2lkICpiYXNlLCBNUElfQWludCBzaXplLCBpbnQgZGlzcF91bml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9JbmZvIGluZm8sIE1QSV9Db21tIGNvbW0sIE1QSV9XaW4gKndpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlcihNUElfV2luX2VycmhhbmRsZXJfZm4gKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fY3JlYXRlX2tleXZhbChNUElfV2luX2NvcHlfYXR0cl9mdW5jdGlvbiAqd2luX2NvcHlfYXR0cl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1dpbl9kZWxldGVfYXR0cl9mdW5jdGlvbiAqd2luX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKndpbl9rZXl2YWwsIHZvaWQgKmV4dHJhX3N0YXRlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2RlbGV0ZV9hdHRyKE1QSV9XaW4gd2luLCBpbnQgd2luX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfV2luIE1QSV9XaW5fZjJjKE1QSV9GaW50IHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9mZW5jZShpbnQgYXNzZXJ0LCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9mcmVlKE1QSV9XaW4gKndpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9mcmVlX2tleXZhbChpbnQgKndpbl9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fZ2V0X2F0dHIoTVBJX1dpbiB3aW4sIGludCB3aW5fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cmlidXRlX3ZhbCwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2dldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9nZXRfZ3JvdXAoTVBJX1dpbiB3aW4sIE1QSV9Hcm91cCAqZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fZ2V0X25hbWUoTVBJX1dpbiB3aW4sIGNoYXIgKndpbl9uYW1lLCBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9sb2NrKGludCBsb2NrX3R5cGUsIGludCByYW5rLCBpbnQgYXNzZXJ0LCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9wb3N0KE1QSV9Hcm91cCBncm91cCwgaW50IGFzc2VydCwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fc2V0X2F0dHIoTVBJX1dpbiB3aW4sIGludCB3aW5fa2V5dmFsLCB2b2lkICphdHRyaWJ1dGVfdmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3NldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3NldF9uYW1lKE1QSV9XaW4gd2luLCBjaGFyICp3aW5fbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9zdGFydChNUElfR3JvdXAgZ3JvdXAsIGludCBhc3NlcnQsIE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3Rlc3QoTVBJX1dpbiB3aW4sIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl91bmxvY2soaW50IHJhbmssIE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3dhaXQoTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgZG91YmxlIE1QSV9XdGljayh2b2lkKTsKLU9NUElfREVDTFNQRUMgIGRvdWJsZSBNUElfV3RpbWUodm9pZCk7Ci0KLQotICAvKgotICAgKiBQcm9maWxpbmcgTVBJIEFQSQotICAgKi8KLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0Fib3J0KE1QSV9Db21tIGNvbW0sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQWNjdW11bGF0ZSh2b2lkICpvcmlnaW5fYWRkciwgaW50IG9yaWdpbl9jb3VudCwgTVBJX0RhdGF0eXBlIG9yaWdpbl9kYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldF9yYW5rLCBNUElfQWludCB0YXJnZXRfZGlzcCwgaW50IHRhcmdldF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX09wIG9wLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BZGRfZXJyb3JfY2xhc3MoaW50ICplcnJvcmNsYXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FkZF9lcnJvcl9jb2RlKGludCBlcnJvcmNsYXNzLCBpbnQgKmVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BZGRfZXJyb3Jfc3RyaW5nKGludCBlcnJvcmNvZGUsIGNoYXIgKnN0cmluZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BZGRyZXNzKHZvaWQgKmxvY2F0aW9uLCBNUElfQWludCAqYWRkcmVzcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BbGxnYXRoZXIodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FsbGdhdGhlcnYodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGlzcGxzLCBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQWxsb2NfbWVtKE1QSV9BaW50IHNpemUsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZXB0cik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BbGxyZWR1Y2Uodm9pZCAqc2VuZGJ1Ziwgdm9pZCAqcmVjdmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX09wIG9wLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FsbHRvYWxsKHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQWxsdG9hbGx2KHZvaWQgKnNlbmRidWYsIGludCAqc2VuZGNvdW50cywgaW50ICpzZGlzcGxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwgdm9pZCAqcmVjdmJ1ZiwgaW50ICpyZWN2Y291bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmRpc3BscywgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FsbHRvYWxsdyh2b2lkICpzZW5kYnVmLCBpbnQgKnNlbmRjb3VudHMsIGludCAqc2Rpc3BscywgTVBJX0RhdGF0eXBlICpzZW5kdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCAqcmVjdmNvdW50cywgaW50ICpyZGlzcGxzLCBNUElfRGF0YXR5cGUgKnJlY3Z0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BdHRyX2RlbGV0ZShNUElfQ29tbSBjb21tLCBpbnQga2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0F0dHJfZ2V0KE1QSV9Db21tIGNvbW0sIGludCBrZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BdHRyX3B1dChNUElfQ29tbSBjb21tLCBpbnQga2V5dmFsLCB2b2lkICphdHRyaWJ1dGVfdmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0JhcnJpZXIoTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9CY2FzdCh2b2lkICpidWZmZXIsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvb3QsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQnNlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0JzZW5kX2luaXQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0J1ZmZlcl9hdHRhY2godm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9CdWZmZXJfZGV0YWNoKHZvaWQgKmJ1ZmZlciwgaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NhbmNlbChNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X2Nvb3JkcyhNUElfQ29tbSBjb21tLCBpbnQgcmFuaywgaW50IG1heGRpbXMsIGludCAqY29vcmRzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NhcnRfY3JlYXRlKE1QSV9Db21tIG9sZF9jb21tLCBpbnQgbmRpbXMsIGludCAqZGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGVyaW9kcywgaW50IHJlb3JkZXIsIE1QSV9Db21tICpjb21tX2NhcnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ2FydF9nZXQoTVBJX0NvbW0gY29tbSwgaW50IG1heGRpbXMsIGludCAqZGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGVyaW9kcywgaW50ICpjb29yZHMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ2FydF9tYXAoTVBJX0NvbW0gY29tbSwgaW50IG5kaW1zLCBpbnQgKmRpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBlcmlvZHMsIGludCAqbmV3cmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X3JhbmsoTVBJX0NvbW0gY29tbSwgaW50ICpjb29yZHMsIGludCAqcmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X3NoaWZ0KE1QSV9Db21tIGNvbW0sIGludCBkaXJlY3Rpb24sIGludCBkaXNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJhbmtfc291cmNlLCBpbnQgKnJhbmtfZGVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X3N1YihNUElfQ29tbSBjb21tLCBpbnQgKnJlbWFpbl9kaW1zLCBNUElfQ29tbSAqbmV3X2NvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ2FydGRpbV9nZXQoTVBJX0NvbW0gY29tbSwgaW50ICpuZGltcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DbG9zZV9wb3J0KGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2FjY2VwdChjaGFyICpwb3J0X25hbWUsIE1QSV9JbmZvIGluZm8sIGludCByb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9Db21tX2MyZihNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fY2FsbF9lcnJoYW5kbGVyKE1QSV9Db21tIGNvbW0sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jb21wYXJlKE1QSV9Db21tIGNvbW0xLCBNUElfQ29tbSBjb21tMiwgaW50ICpyZXN1bHQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jb25uZWN0KGNoYXIgKnBvcnRfbmFtZSwgTVBJX0luZm8gaW5mbywgaW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jcmVhdGVfZXJyaGFuZGxlcihNUElfQ29tbV9lcnJoYW5kbGVyX2ZuICpmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jcmVhdGVfa2V5dmFsKE1QSV9Db21tX2NvcHlfYXR0cl9mdW5jdGlvbiAqY29tbV9jb3B5X2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW1fZGVsZXRlX2F0dHJfZnVuY3Rpb24gKmNvbW1fZGVsZXRlX2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb21tX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jcmVhdGUoTVBJX0NvbW0gY29tbSwgTVBJX0dyb3VwIGdyb3VwLCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2RlbGV0ZV9hdHRyKE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2Rpc2Nvbm5lY3QoTVBJX0NvbW0gKmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9kdXAoTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0NvbW0gUE1QSV9Db21tX2YyYyhNUElfRmludCBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fZnJlZV9rZXl2YWwoaW50ICpjb21tX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2ZyZWUoTVBJX0NvbW0gKmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9nZXRfYXR0cihNUElfQ29tbSBjb21tLCBpbnQgY29tbV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2dldF9lcnJoYW5kbGVyKE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyICplcmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9nZXRfbmFtZShNUElfQ29tbSBjb21tLCBjaGFyICpjb21tX25hbWUsIGludCAqcmVzdWx0bGVuKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fZ2V0X3BhcmVudChNUElfQ29tbSAqcGFyZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fZ3JvdXAoTVBJX0NvbW0gY29tbSwgTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2pvaW4oaW50IGZkLCBNUElfQ29tbSAqaW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fcmFuayhNUElfQ29tbSBjb21tLCBpbnQgKnJhbmspOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9yZW1vdGVfZ3JvdXAoTVBJX0NvbW0gY29tbSwgTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3JlbW90ZV9zaXplKE1QSV9Db21tIGNvbW0sIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3NldF9hdHRyKE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwgdm9pZCAqYXR0cmlidXRlX3ZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3NldF9lcnJoYW5kbGVyKE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyIGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9zZXRfbmFtZShNUElfQ29tbSBjb21tLCBjaGFyICpjb21tX25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9zaXplKE1QSV9Db21tIGNvbW0sIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3NwYXduKGNoYXIgKmNvbW1hbmQsIGNoYXIgKiphcmd2LCBpbnQgbWF4cHJvY3MsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqaW50ZXJjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFycmF5X29mX2VycmNvZGVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fc3Bhd25fbXVsdGlwbGUoaW50IGNvdW50LCBjaGFyICoqYXJyYXlfb2ZfY29tbWFuZHMsIGNoYXIgKioqYXJyYXlfb2ZfYXJndiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICphcnJheV9vZl9tYXhwcm9jcywgTVBJX0luZm8gKmFycmF5X29mX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqaW50ZXJjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFycmF5X29mX2VycmNvZGVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fc3BsaXQoTVBJX0NvbW0gY29tbSwgaW50IGNvbG9yLCBpbnQga2V5LCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3Rlc3RfaW50ZXIoTVBJX0NvbW0gY29tbSwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0RpbXNfY3JlYXRlKGludCBubm9kZXMsIGludCBuZGltcywgaW50ICpkaW1zKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IFBNUElfRXJyaGFuZGxlcl9jMmYoTVBJX0VycmhhbmRsZXIgZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9FcnJoYW5kbGVyX2NyZWF0ZShNUElfSGFuZGxlcl9mdW5jdGlvbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRXJyaGFuZGxlciBQTVBJX0VycmhhbmRsZXJfZjJjKE1QSV9GaW50IGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRXJyaGFuZGxlcl9mcmVlKE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0VycmhhbmRsZXJfZ2V0KE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0VycmhhbmRsZXJfc2V0KE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyIGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRXJyb3JfY2xhc3MoaW50IGVycm9yY29kZSwgaW50ICplcnJvcmNsYXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0Vycm9yX3N0cmluZyhpbnQgZXJyb3Jjb2RlLCBjaGFyICpzdHJpbmcsIGludCAqcmVzdWx0bGVuKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0V4c2Nhbih2b2lkICpzZW5kYnVmLCB2b2lkICpyZWN2YnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9GaWxlX2MyZihNUElfRmlsZSBmaWxlKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaWxlIFBNUElfRmlsZV9mMmMoTVBJX0ZpbnQgZmlsZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2NhbGxfZXJyaGFuZGxlcihNUElfRmlsZSBmaCwgaW50IGVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2NyZWF0ZV9lcnJoYW5kbGVyKE1QSV9GaWxlX2VycmhhbmRsZXJfZm4gKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NldF9lcnJoYW5kbGVyKCBNUElfRmlsZSBmaWxlLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X2VycmhhbmRsZXIoIE1QSV9GaWxlIGZpbGUsIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfb3BlbihNUElfQ29tbSBjb21tLCBjaGFyICpmaWxlbmFtZSwgaW50IGFtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9JbmZvIGluZm8sIE1QSV9GaWxlICpmaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2Nsb3NlKE1QSV9GaWxlICpmaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2RlbGV0ZShjaGFyICpmaWxlbmFtZSwgTVBJX0luZm8gaW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NldF9zaXplKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IHNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9wcmVhbGxvY2F0ZShNUElfRmlsZSBmaCwgTVBJX09mZnNldCBzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X3NpemUoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfZ3JvdXAoTVBJX0ZpbGUgZmgsIE1QSV9Hcm91cCAqZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfYW1vZGUoTVBJX0ZpbGUgZmgsIGludCAqYW1vZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9zZXRfaW5mbyhNUElfRmlsZSBmaCwgTVBJX0luZm8gaW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2dldF9pbmZvKE1QSV9GaWxlIGZoLCBNUElfSW5mbyAqaW5mb191c2VkKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfc2V0X3ZpZXcoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgZGlzcCwgTVBJX0RhdGF0eXBlIGV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZmlsZXR5cGUsIGNoYXIgKmRhdGFyZXAsIE1QSV9JbmZvIGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfdmlldyhNUElfRmlsZSBmaCwgTVBJX09mZnNldCAqZGlzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpldHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpmaWxldHlwZSwgY2hhciAqZGF0YXJlcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXRfYWxsKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9hdF9hbGwoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfaXJlYWRfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2l3cml0ZV9hdChNUElfRmlsZSBmaCwgTVBJX09mZnNldCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfcmVhZF9hbGwoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3dyaXRlKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9hbGwoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9pcmVhZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9pd3JpdGUoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NlZWsoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X3Bvc2l0aW9uKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0ICpvZmZzZXQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfYnl0ZV9vZmZzZXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX09mZnNldCAqZGlzcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfc2hhcmVkKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9pcmVhZF9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2l3cml0ZV9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9yZWFkX29yZGVyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9vcmRlcmVkKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NlZWtfc2hhcmVkKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgaW50IHdoZW5jZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2dldF9wb3NpdGlvbl9zaGFyZWQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgKm9mZnNldCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXRfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXRfYWxsX2VuZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9hdF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3dyaXRlX2F0X2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfcmVhZF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9yZWFkX2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3dyaXRlX2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfcmVhZF9vcmRlcmVkX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfb3JkZXJlZF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZF9iZWdpbihNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X3R5cGVfZXh0ZW50KE1QSV9GaWxlIGZoLCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCAqZXh0ZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfc2V0X2F0b21pY2l0eShNUElfRmlsZSBmaCwgaW50IGZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfYXRvbWljaXR5KE1QSV9GaWxlIGZoLCBpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9zeW5jKE1QSV9GaWxlIGZoKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbmFsaXplKHZvaWQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmluYWxpemVkKGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GcmVlX21lbSh2b2lkICpiYXNlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dhdGhlcih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dhdGhlcnYodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsIGludCAqZGlzcGxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIGludCByb290LCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dldF9hZGRyZXNzKHZvaWQgKmxvY2F0aW9uLCBNUElfQWludCAqYWRkcmVzcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HZXRfY291bnQoTVBJX1N0YXR1cyAqc3RhdHVzLCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCAqY291bnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR2V0X2VsZW1lbnRzKE1QSV9TdGF0dXMgKnN0YXR1cywgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY291bnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR2V0KHZvaWQgKm9yaWdpbl9hZGRyLCBpbnQgb3JpZ2luX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsIGludCB0YXJnZXRfcmFuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCB0YXJnZXRfZGlzcCwgaW50IHRhcmdldF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgdGFyZ2V0X2RhdGF0eXBlLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HZXRfcHJvY2Vzc29yX25hbWUoY2hhciAqbmFtZSwgaW50ICpyZXN1bHRsZW4pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR2V0X3ZlcnNpb24oaW50ICp2ZXJzaW9uLCBpbnQgKnN1YnZlcnNpb24pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JhcGhfY3JlYXRlKE1QSV9Db21tIGNvbW1fb2xkLCBpbnQgbm5vZGVzLCBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZWRnZXMsIGludCByZW9yZGVyLCBNUElfQ29tbSAqY29tbV9ncmFwaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HcmFwaF9nZXQoTVBJX0NvbW0gY29tbSwgaW50IG1heGluZGV4LCBpbnQgbWF4ZWRnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwgaW50ICplZGdlcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HcmFwaF9tYXAoTVBJX0NvbW0gY29tbSwgaW50IG5ub2RlcywgaW50ICppbmRleCwgaW50ICplZGdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5ld3JhbmspOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JhcGhfbmVpZ2hib3JzX2NvdW50KE1QSV9Db21tIGNvbW0sIGludCByYW5rLCBpbnQgKm5uZWlnaGJvcnMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JhcGhfbmVpZ2hib3JzKE1QSV9Db21tIGNvbW0sIGludCByYW5rLCBpbnQgbWF4bmVpZ2hib3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmVpZ2hib3JzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyYXBoZGltc19nZXQoTVBJX0NvbW0gY29tbSwgaW50ICpubm9kZXMsIGludCAqbmVkZ2VzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyZXF1ZXN0X2NvbXBsZXRlKE1QSV9SZXF1ZXN0IHJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JlcXVlc3Rfc3RhcnQoTVBJX0dyZXF1ZXN0X3F1ZXJ5X2Z1bmN0aW9uICpxdWVyeV9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9HcmVxdWVzdF9mcmVlX2Z1bmN0aW9uICpmcmVlX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyZXF1ZXN0X2NhbmNlbF9mdW5jdGlvbiAqY2FuY2VsX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFfc3RhdGUsIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IFBNUElfR3JvdXBfYzJmKE1QSV9Hcm91cCBncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9jb21wYXJlKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsIGludCAqcmVzdWx0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyb3VwX2RpZmZlcmVuY2UoTVBJX0dyb3VwIGdyb3VwMSwgTVBJX0dyb3VwIGdyb3VwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9leGNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCAqcmFua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgTVBJX0dyb3VwIFBNUElfR3JvdXBfZjJjKE1QSV9GaW50IGdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyb3VwX2ZyZWUoTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9pbmNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCAqcmFua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JvdXBfaW50ZXJzZWN0aW9uKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9yYW5nZV9leGNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCByYW5nZXNbXVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9yYW5nZV9pbmNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCByYW5nZXNbXVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9yYW5rKE1QSV9Hcm91cCBncm91cCwgaW50ICpyYW5rKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyb3VwX3NpemUoTVBJX0dyb3VwIGdyb3VwLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JvdXBfdHJhbnNsYXRlX3JhbmtzKE1QSV9Hcm91cCBncm91cDEsIGludCBuLCBpbnQgKnJhbmtzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgZ3JvdXAyLCBpbnQgKnJhbmtzMik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF91bmlvbihNUElfR3JvdXAgZ3JvdXAxLCBNUElfR3JvdXAgZ3JvdXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JYnNlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9JbmZvX2MyZihNUElfSW5mbyBpbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fY3JlYXRlKE1QSV9JbmZvICppbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZGVsZXRlKE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JbmZvX2R1cChNUElfSW5mbyBpbmZvLCBNUElfSW5mbyAqbmV3aW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfSW5mbyBQTVBJX0luZm9fZjJjKE1QSV9GaW50IGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSW5mb19mcmVlKE1QSV9JbmZvICppbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZ2V0KE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSwgaW50IHZhbHVlbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdmFsdWUsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JbmZvX2dldF9ua2V5cyhNUElfSW5mbyBpbmZvLCBpbnQgKm5rZXlzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZ2V0X250aGtleShNUElfSW5mbyBpbmZvLCBpbnQgbiwgY2hhciAqa2V5KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZ2V0X3ZhbHVlbGVuKE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSwgaW50ICp2YWx1ZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JbmZvX3NldChNUElfSW5mbyBpbmZvLCBjaGFyICprZXksIGNoYXIgKnZhbHVlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luaXQoaW50ICphcmdjLCBjaGFyICoqKmFyZ3YpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSW5pdGlhbGl6ZWQoaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luaXRfdGhyZWFkKGludCAqYXJnYywgY2hhciAqKiphcmd2LCBpbnQgcmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnByb3ZpZGVkKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ludGVyY29tbV9jcmVhdGUoTVBJX0NvbW0gbG9jYWxfY29tbSwgaW50IGxvY2FsX2xlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gYnJpZGdlX2NvbW0sIGludCByZW1vdGVfbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSAqbmV3aW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ludGVyY29tbV9tZXJnZShNUElfQ29tbSBpbnRlcmNvbW0sIGludCBoaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tICpuZXdpbnRlcmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSXByb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSXJlY3Yodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0lyc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Jc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0lzc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Jc190aHJlYWRfbWFpbihpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfS2V5dmFsX2NyZWF0ZShNUElfQ29weV9mdW5jdGlvbiAqY29weV9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RlbGV0ZV9mdW5jdGlvbiAqZGVsZXRlX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmtleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfS2V5dmFsX2ZyZWUoaW50ICprZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfTG9va3VwX25hbWUoY2hhciAqc2VydmljZV9uYW1lLCBNUElfSW5mbyBpbmZvLCBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9PcF9jMmYoTVBJX09wIG9wKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX09wX2NyZWF0ZShNUElfVXNlcl9mdW5jdGlvbiAqZnVuY3Rpb24sIGludCBjb21tdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9PcCAqb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfT3Blbl9wb3J0KE1QSV9JbmZvIGluZm8sIGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfT3AgUE1QSV9PcF9mMmMoTVBJX0ZpbnQgb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfT3BfZnJlZShNUElfT3AgKm9wKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1BhY2tfZXh0ZXJuYWwoY2hhciAqZGF0YXJlcCwgdm9pZCAqaW5idWYsIGludCBpbmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIHZvaWQgKm91dGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgb3V0c2l6ZSwgTVBJX0FpbnQgKnBvc2l0aW9uKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1BhY2tfZXh0ZXJuYWxfc2l6ZShjaGFyICpkYXRhcmVwLCBpbnQgaW5jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9BaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1BhY2sodm9pZCAqaW5idWYsIGludCBpbmNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dGJ1ZiwgaW50IG91dHNpemUsIGludCAqcG9zaXRpb24sIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfUGFja19zaXplKGludCBpbmNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1Bjb250cm9sKGNvbnN0IGludCBsZXZlbCwgLi4uKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1Byb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9QdWJsaXNoX25hbWUoY2hhciAqc2VydmljZV9uYW1lLCBNUElfSW5mbyBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9QdXQodm9pZCAqb3JpZ2luX2FkZHIsIGludCBvcmlnaW5fY291bnQsIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldF9yYW5rLCBNUElfQWludCB0YXJnZXRfZGlzcCwgaW50IHRhcmdldF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgdGFyZ2V0X2RhdGF0eXBlLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9RdWVyeV90aHJlYWQoaW50ICpwcm92aWRlZCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWN2X2luaXQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWN2KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWR1Y2Uodm9pZCAqc2VuZGJ1Ziwgdm9pZCAqcmVjdmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX09wIG9wLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWR1Y2Vfc2NhdHRlcih2b2lkICpzZW5kYnVmLCB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9PcCBvcCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWdpc3Rlcl9kYXRhcmVwKGNoYXIgKmRhdGFyZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhcmVwX2NvbnZlcnNpb25fZnVuY3Rpb24gKnJlYWRfY29udmVyc2lvbl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfY29udmVyc2lvbl9mdW5jdGlvbiAqd3JpdGVfY29udmVyc2lvbl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfZXh0ZW50X2Z1bmN0aW9uICpkdHlwZV9maWxlX2V4dGVudF9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9SZXF1ZXN0X2MyZihNUElfUmVxdWVzdCByZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIE1QSV9SZXF1ZXN0IFBNUElfUmVxdWVzdF9mMmMoTVBJX0ZpbnQgcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZXF1ZXN0X2ZyZWUoTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfUmVxdWVzdF9nZXRfc3RhdHVzKE1QSV9SZXF1ZXN0IHJlcXVlc3QsIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfUnNlbmQodm9pZCAqaWJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Sc2VuZF9pbml0KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TY2FuKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2NhdHRlcih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvb3QsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2NhdHRlcnYodm9pZCAqc2VuZGJ1ZiwgaW50ICpzZW5kY291bnRzLCBpbnQgKmRpc3BscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwgaW50IHJvb3QsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2VuZF9pbml0KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TZW5kcmVjdih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHNlbmR0YWcsIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSwgIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TZW5kcmVjdl9yZXBsYWNlKHZvaWQgKiBidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHNlbmR0YWcsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU3NlbmRfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHRhZywgTVBJX0NvbW0gY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU3NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1N0YXJ0KE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1N0YXJ0YWxsKGludCBjb3VudCwgTVBJX1JlcXVlc3QgKmFycmF5X29mX3JlcXVlc3RzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1N0YXR1c19jMmYoTVBJX1N0YXR1cyAqY19zdGF0dXMsIE1QSV9GaW50ICpmX3N0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TdGF0dXNfZjJjKE1QSV9GaW50ICpmX3N0YXR1cywgTVBJX1N0YXR1cyAqY19zdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU3RhdHVzX3NldF9jYW5jZWxsZWQoTVBJX1N0YXR1cyAqc3RhdHVzLCBpbnQgZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TdGF0dXNfc2V0X2VsZW1lbnRzKE1QSV9TdGF0dXMgKnN0YXR1cywgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVGVzdGFsbChpbnQgY291bnQsIE1QSV9SZXF1ZXN0IGFycmF5X29mX3JlcXVlc3RzW10sIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyBhcnJheV9vZl9zdGF0dXNlc1tdKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1Rlc3RhbnkoaW50IGNvdW50LCBNUElfUmVxdWVzdCBhcnJheV9vZl9yZXF1ZXN0c1tdLCBpbnQgKmluZGV4LCBpbnQgKmZsYWcsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UZXN0KE1QSV9SZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgKmZsYWcsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UZXN0X2NhbmNlbGxlZChNUElfU3RhdHVzICpzdGF0dXMsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UZXN0c29tZShpbnQgaW5jb3VudCwgTVBJX1JlcXVlc3QgYXJyYXlfb2ZfcmVxdWVzdHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0Y291bnQsIGludCBhcnJheV9vZl9pbmRpY2VzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzIGFycmF5X29mX3N0YXR1c2VzW10pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVG9wb190ZXN0KE1QSV9Db21tIGNvbW0sIGludCAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IFBNUElfVHlwZV9jMmYoTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfY29tbWl0KE1QSV9EYXRhdHlwZSAqdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2NvbnRpZ3VvdXMoaW50IGNvdW50LCBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfZGFycmF5KGludCBzaXplLCBpbnQgcmFuaywgaW50IG5kaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnc2l6ZV9hcnJheVtdLCBpbnQgZGlzdHJpYl9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXJnX2FycmF5W10sIGludCBwc2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlciwgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfY3JlYXRlX2Y5MF9jb21wbGV4KGludCBwLCBpbnQgciwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfY3JlYXRlX2Y5MF9pbnRlZ2VyKGludCByLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfZjkwX3JlYWwoaW50IHAsIGludCByLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCBhcnJheV9vZl9kaXNwbGFjZW1lbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2NyZWF0ZV9odmVjdG9yKGludCBjb3VudCwgaW50IGJsb2NrbGVuZ3RoLCBNUElfQWludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfa2V5dmFsKE1QSV9UeXBlX2NvcHlfYXR0cl9mdW5jdGlvbiAqdHlwZV9jb3B5X2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1R5cGVfZGVsZXRlX2F0dHJfZnVuY3Rpb24gKnR5cGVfZGVsZXRlX2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfaW5kZXhlZF9ibG9jayhpbnQgY291bnQsIGludCBibG9ja2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2NyZWF0ZV9zdHJ1Y3QoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tfbGVuZ3Roc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgYXJyYXlfb2ZfdHlwZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfc3ViYXJyYXkoaW50IG5kaW1zLCBpbnQgc2l6ZV9hcnJheVtdLCBpbnQgc3Vic2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2FycmF5W10sIGludCBvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfcmVzaXplZChNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0FpbnQgbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGV4dGVudCwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZGVsZXRlX2F0dHIoTVBJX0RhdGF0eXBlIHR5cGUsIGludCB0eXBlX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2R1cChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZXh0ZW50KE1QSV9EYXRhdHlwZSB0eXBlLCBNUElfQWludCAqZXh0ZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZnJlZShNUElfRGF0YXR5cGUgKnR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9mcmVlX2tleXZhbChpbnQgKnR5cGVfa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIE1QSV9EYXRhdHlwZSBQTVBJX1R5cGVfZjJjKE1QSV9GaW50IGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZ2V0X2F0dHIoTVBJX0RhdGF0eXBlIHR5cGUsIGludCB0eXBlX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cmlidXRlX3ZhbCwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZ2V0X2NvbnRlbnRzKE1QSV9EYXRhdHlwZSBtdHlwZSwgaW50IG1heF9pbnRlZ2VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYWRkcmVzc2VzLCBpbnQgbWF4X2RhdGF0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheV9vZl9pbnRlZ2Vyc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfYWRkcmVzc2VzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgYXJyYXlfb2ZfZGF0YXR5cGVzW10pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9nZXRfZW52ZWxvcGUoTVBJX0RhdGF0eXBlIHR5cGUsIGludCAqbnVtX2ludGVnZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fYWRkcmVzc2VzLCBpbnQgKm51bV9kYXRhdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbWJpbmVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZ2V0X2V4dGVudChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0FpbnQgKmxiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50ICpleHRlbnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9nZXRfbmFtZShNUElfRGF0YXR5cGUgdHlwZSwgY2hhciAqdHlwZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2dldF90cnVlX2V4dGVudChNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9BaW50ICp0cnVlX2xiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgKnRydWVfZXh0ZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2h2ZWN0b3IoaW50IGNvdW50LCBpbnQgYmxvY2tsZW5ndGgsIE1QSV9BaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfaW5kZXhlZChpbnQgY291bnQsIGludCBhcnJheV9vZl9ibG9ja2xlbmd0aHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9sYihNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0FpbnQgKmxiKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfbWF0Y2hfc2l6ZShpbnQgdHlwZWNsYXNzLCBpbnQgc2l6ZSwgTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfc2V0X2F0dHIoTVBJX0RhdGF0eXBlIHR5cGUsIGludCB0eXBlX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cl92YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9zZXRfbmFtZShNUElfRGF0YXR5cGUgdHlwZSwgY2hhciAqdHlwZV9uYW1lKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfc2l6ZShNUElfRGF0YXR5cGUgdHlwZSwgaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfc3RydWN0KGludCBjb3VudCwgaW50IGFycmF5X29mX2Jsb2NrbGVuZ3Roc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGFycmF5X29mX3R5cGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV91YihNUElfRGF0YXR5cGUgbXR5cGUsIE1QSV9BaW50ICp1Yik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX3ZlY3RvcihpbnQgY291bnQsIGludCBibG9ja2xlbmd0aCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVW5wYWNrKHZvaWQgKmluYnVmLCBpbnQgaW5zaXplLCBpbnQgKnBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dGJ1ZiwgaW50IG91dGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9VbnB1Ymxpc2hfbmFtZShjaGFyICpzZXJ2aWNlX25hbWUsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVW5wYWNrX2V4dGVybmFsIChjaGFyICpkYXRhcmVwLCB2b2lkICppbmJ1ZiwgTVBJX0FpbnQgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCAqcG9zaXRpb24sIHZvaWQgKm91dGJ1ZiwgaW50IG91dGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2FpdGFsbChpbnQgY291bnQsIE1QSV9SZXF1ZXN0ICphcnJheV9vZl9yZXF1ZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2FpdGFueShpbnQgY291bnQsIE1QSV9SZXF1ZXN0ICphcnJheV9vZl9yZXF1ZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dhaXQoTVBJX1JlcXVlc3QgKnJlcXVlc3QsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XYWl0c29tZShpbnQgaW5jb3VudCwgTVBJX1JlcXVlc3QgKmFycmF5X29mX3JlcXVlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRjb3VudCwgaW50ICphcnJheV9vZl9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9XaW5fYzJmKE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jYWxsX2VycmhhbmRsZXIoTVBJX1dpbiB3aW4sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2NvbXBsZXRlKE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jcmVhdGUodm9pZCAqYmFzZSwgTVBJX0FpbnQgc2l6ZSwgaW50IGRpc3BfdW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0luZm8gaW5mbywgTVBJX0NvbW0gY29tbSwgTVBJX1dpbiAqd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlcihNUElfV2luX2VycmhhbmRsZXJfZm4gKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jcmVhdGVfa2V5dmFsKE1QSV9XaW5fY29weV9hdHRyX2Z1bmN0aW9uICp3aW5fY29weV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1dpbl9kZWxldGVfYXR0cl9mdW5jdGlvbiAqd2luX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3aW5fa2V5dmFsLCB2b2lkICpleHRyYV9zdGF0ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fZGVsZXRlX2F0dHIoTVBJX1dpbiB3aW4sIGludCB3aW5fa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIE1QSV9XaW4gUE1QSV9XaW5fZjJjKE1QSV9GaW50IHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fZmVuY2UoaW50IGFzc2VydCwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2ZyZWUoTVBJX1dpbiAqd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9mcmVlX2tleXZhbChpbnQgKndpbl9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2dldF9hdHRyKE1QSV9XaW4gd2luLCBpbnQgd2luX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphdHRyaWJ1dGVfdmFsLCBpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2dldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fZ2V0X2dyb3VwKE1QSV9XaW4gd2luLCBNUElfR3JvdXAgKmdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9nZXRfbmFtZShNUElfV2luIHdpbiwgY2hhciAqd2luX25hbWUsIGludCAqcmVzdWx0bGVuKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9sb2NrKGludCBsb2NrX3R5cGUsIGludCByYW5rLCBpbnQgYXNzZXJ0LCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fcG9zdChNUElfR3JvdXAgZ3JvdXAsIGludCBhc3NlcnQsIE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9zZXRfYXR0cihNUElfV2luIHdpbiwgaW50IHdpbl9rZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX3NldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9zZXRfbmFtZShNUElfV2luIHdpbiwgY2hhciAqd2luX25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX3N0YXJ0KE1QSV9Hcm91cCBncm91cCwgaW50IGFzc2VydCwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX3Rlc3QoTVBJX1dpbiB3aW4sIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fdW5sb2NrKGludCByYW5rLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fd2FpdChNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBkb3VibGUgUE1QSV9XdGljayh2b2lkKTsKLU9NUElfREVDTFNQRUMgIGRvdWJsZSBQTVBJX1d0aW1lKHZvaWQpOwotCi0jaWYgZGVmaW5lZChjX3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotfQotI2VuZGlmCi0KLS8qCi0gKiBDb25kaXRpb25hbCBNUEkgMiBDKysgYmluZGluZ3Mgc3VwcG9ydC4gIEluY2x1ZGUgaWY6Ci0gKiAgIC0gVGhlIHVzZXIgZG9lcyBub3QgZXhwbGljaXRseSByZXF1ZXN0IHVzIHRvIHNraXAgaXQgKHdoZW4gYSBDKysgY29tcGlsZXIKLSAqICAgICAgIGlzIHVzZWQgdG8gY29tcGlsZSBDIGNvZGUpLgotICogICAtIFdlIHdhbnQgQysrIGJpbmRpbmdzIHN1cHBvcnQKLSAqICAgLSBXZSBhcmUgbm90IGJ1aWxkaW5nIE9NUEkgaXRzZWxmCi0gKiAgIC0gV2UgYXJlIHVzaW5nIGEgQysrIGNvbXBpbGVyCi0gKi8KLSNpZiAhZGVmaW5lZChPTVBJX1NLSVBfTVBJQ1hYKSAmJiBPTVBJX1dBTlRfQ1hYX0JJTkRJTkdTICYmICFPTVBJX0JVSUxESU5HCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotI2luY2x1ZGUgIm9wZW5tcGkvb21waS9tcGkvY3h4L21waWN4eC5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIE9NUElfTVBJX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvcmVzb3VyY2VzL3Rlc3RNUEkuYyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvcmVzb3VyY2VzL3Rlc3RNUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhMTZjZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL3Jlc291cmNlcy90ZXN0TVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJtcGkuaCIKLS8vIFNhbXBsZSBNUEkgcHJvZ3JhbQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0JcHJpbnRmKCJIZWxsbyBNUEkgUFRQIFdvcmxkIVxuIik7CQotCWludCAgbXlfcmFuazsgLyogcmFuayBvZiBwcm9jZXNzICovCi0JaW50ICBwOyAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc2VzICovCi0JaW50IHNvdXJjZTsgICAvKiByYW5rIG9mIHNlbmRlciAqLwotCWludCBkZXN0OyAgICAgLyogcmFuayBvZiByZWNlaXZlciAqLwotCWludCB0YWc9MDsgICAgLyogdGFnIGZvciBtZXNzYWdlcyAqLwotCWNoYXIgbWVzc2FnZVsxMDBdOyAgICAgICAgLyogc3RvcmFnZSBmb3IgbWVzc2FnZSAqLwotCU1QSV9TdGF0dXMgc3RhdHVzIDsgICAvKiByZXR1cm4gc3RhdHVzIGZvciByZWNlaXZlICovCi0JCi0JLyogc3RhcnQgdXAgTVBJICovCi0JCi0JTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKLQkKLQkvKiBmaW5kIG91dCBwcm9jZXNzIHJhbmsgKi8KLQlNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmbXlfcmFuayk7IAotCQotCS8qIGZpbmQgb3V0IG51bWJlciBvZiBwcm9jZXNzZXMgKi8KLQlNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmcCk7IAotCQotCQotCWlmIChteV9yYW5rICE9MCl7Ci0JCS8qIGNyZWF0ZSBtZXNzYWdlICovCi0JCXNwcmludGYobWVzc2FnZSwgIkdyZWV0aW5ncyBmcm9tIHByb2Nlc3MgJWQhIiwgbXlfcmFuayk7Ci0JCWRlc3QgPSAwOwotCQkvKiB1c2Ugc3RybGVuKzEgc28gdGhhdCAnXDAnIGdldCB0cmFuc21pdHRlZCAqLwotCQlNUElfU2VuZChtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkrMSwgTVBJX0NIQVIsCi0JCSAgIGRlc3QsIHRhZywgTVBJX0NPTU1fV09STEQpOwotCX0KLQllbHNlewotCQlwcmludGYoIkZyb20gcHJvY2VzcyAwOiBOdW0gcHJvY2Vzc2VzOiAlZFxuIixwKTsKLQkJZm9yIChzb3VyY2UgPSAxOyBzb3VyY2UgPCBwOyBzb3VyY2UrKykgewotCQkJTVBJX1JlY3YobWVzc2FnZSwgMTAwLCBNUElfQ0hBUiwgc291cmNlLCB0YWcsCi0JCQkgICAgICBNUElfQ09NTV9XT1JMRCwgJnN0YXR1cyk7Ci0JCQlwcmludGYoIiVzXG4iLG1lc3NhZ2UpOwotCQl9Ci0JfQotCS8qIHNodXQgZG93biBNUEkgKi8KLQlNUElfRmluYWxpemUoKTsgCi0JCi0JCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC90ZXN0cy9QbGR0QmFzZVRlc3RGcmFtZXdvcmsuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3Rlc3RzL1BsZHRCYXNlVGVzdEZyYW1ld29yay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGFkNGJlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3Rlc3RzL1BsZHRCYXNlVGVzdEZyYW1ld29yay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS50ZXN0cy5CYXNlVGVzdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGJldGgKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGxkdEJhc2VUZXN0RnJhbWV3b3JrIGV4dGVuZHMgQmFzZVRlc3RGcmFtZXdvcmsgewotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SW50ZWdlcj4+IGxpbmVNYXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SW50ZWdlcj4+KCk7Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGZpbGUgaW50byB0aGUgdGVzdCBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIElGaWxlIGltcG9ydEZpbGUoU3RyaW5nIHNyY0RpciwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShmaWxlbmFtZSkuZGVsZXRlKHRydWUsIG5ldwotCQkvLyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlJRmlsZSByZXN1bHQgPSBzdXBlci5pbXBvcnRGaWxlKGZpbGVuYW1lLCByZWFkVGVzdEZpbGUoc3JjRGlyLCBmaWxlbmFtZSkpOwotCQkvLyBwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldwotCQkvLyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVhZFRlc3RGaWxlKFN0cmluZyBzcmNEaXIsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SW50ZWdlcj4gbGluZU1hcCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oNTApOwotCQlsaW5lTWFwcy5wdXQoZmlsZW5hbWUsIGxpbmVNYXApOwotCQlsaW5lTWFwLmFkZCgwKTsgLy8gT2Zmc2V0IG9mIGxpbmUgMQotCQlyZXR1cm4gcmVhZFN0cmVhbShsaW5lTWFwLCBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi8iICsgc3JjRGlyICsgIi8iICsgZmlsZW5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWRTdHJlYW0oQXJyYXlMaXN0PEludGVnZXI+IGxpbmVNYXAsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDQwOTYpOwotCQlCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLQkJZm9yIChpbnQgb2Zmc2V0ID0gMCwgY2ggPSBpbi5yZWFkKCk7IGNoID49IDA7IGNoID0gaW4ucmVhZCgpKSB7Ci0JCQlzYi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJCW9mZnNldCsrOwotCi0JCQlpZiAoY2ggPT0gJ1xuJyAmJiBsaW5lTWFwICE9IG51bGwpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmUgIiArIChsaW5lTWFwLnNpemUoKSsxKSArCi0JCQkJLy8gIiBzdGFydHMgYXQgb2Zmc2V0ICIgKyBvZmZzZXQpOwotCQkJCWxpbmVNYXAuYWRkKG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQkJaW4uY2xvc2UoKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcmVhZFN0cmVhbShudWxsLCBpbnB1dFN0cmVhbSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkV29ya3NwYWNlRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiByZWFkU3RyZWFtKHByb2plY3QuZ2V0RmlsZShmaWxlbmFtZSkuZ2V0Q29udGVudHMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIGxpbmUgbnVtYmVyLCBzdGFydGluZyBhdCAxCi0JICogQHBhcmFtIGNvbAotCSAqICAgICAgICAgICAgY29sdW1uIG51bWJlciwgc3RhcnRpbmcgYXQgMQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGluZUNvbE9mZnNldChTdHJpbmcgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sKSB7Ci0JCXJldHVybiBsaW5lTWFwcy5nZXQoZmlsZW5hbWUpLmdldChsaW5lIC0gMSkgKyAoY29sIC0gMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdGVzdHMvVGVzdC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdGVzdHMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODZjYWNiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3Rlc3RzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5hY3Rpb25zLlJ1bkFuYWx5c2VNUEljb21tYW5kSGFuZGxlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgYmV0aAotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBQbGR0QmFzZVRlc3RGcmFtZXdvcmt7Ci0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RNUElhcnRpZmFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IGltcG9ydEZpbGUoInJlc291cmNlcyIsICJ0ZXN0TVBJLmMiKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWxlKTsKLQkJCi0JCUlGaWxlIG1waUluY2x1ZGUgPSBpbXBvcnRGaWxlKCJyZXNvdXJjZXMvaW5jbHVkZXMiLCJtcGkuaCIpOwotCQlhc3NlcnROb3ROdWxsKG1waUluY2x1ZGUpOwotCQlTdHJpbmcgdGVtcFBhdGggPSBtcGlJbmNsdWRlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOy8vaW5jbHVkZVBhdGg9IC9SZWdyZXNzaW9uVGVzdFByb2plY3QvbXBpLmgKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZW1wUGF0aD0iK3RlbXBQYXRoKTsKLQkJU3RyaW5nIGluY2x1ZGVQYXRoID0gbXBpSW5jbHVkZS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UmF3TG9jYXRpb24oKS50b09TU3RyaW5nKCkKLQkJCSsgbXBpSW5jbHVkZS5nZXRGdWxsUGF0aCgpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImluY2x1ZGVQYXRoPSAiK2luY2x1ZGVQYXRoKTsKLQotCQlhc3NlcnRUcnVlKGZpbGUgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKTsKLQotCQkvLyBJQ0VsZW1lbnQgY292ZXJzIGZvbGRlcnMgYW5kIHRyYW5zbGF0aW9udW5pdHMKLQkJZmluYWwgSUNFbGVtZW50IGNlID0gKElDRWxlbWVudCkgKChJQWRhcHRhYmxlKSBmaWxlKS5nZXRBZGFwdGVyKElDRWxlbWVudC5jbGFzcyk7Ci0JCS8vIGFzc2VydE5vdE51bGwoY2UpOwotCQlMaXN0PFN0cmluZz4gaW5jbHVkZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7aW5jbHVkZVBhdGh9KTsKLQkJUnVuQW5hbHlzZU1QSWNvbW1hbmRIYW5kbGVyIHJhY20gPSBuZXcgUnVuQW5hbHlzZU1QSWNvbW1hbmRIYW5kbGVyKCk7Ci0JCQotCQlyYWNtLnJ1blJlc291cmNlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGNlLCAwLCBpbmNsdWRlcyk7Ci0JCQotCQlJTWFya2VyW10gbWFya2Vycz1maWxlLmZpbmRNYXJrZXJzKE1waUlEcy5NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCWFzc2VydE5vdE51bGwobWFya2Vycyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibnVtTWFya2VyczogIittYXJrZXJzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGkrICIgbWFya2VyOiAiK21hcmtlci50b1N0cmluZygpKTsKLQkJCQotCQkJCi0JCX0KLQkJCi0JCQotLy8JCXByb3RlY3RlZCBib29sZWFuIHJ1blJlc291cmNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUNFbGVtZW50IGNlLAotLy8JCQkJaW50IGluZGVudCwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLy5jbGFzc3BhdGggYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY3ZzaWdub3JlIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjOGRkMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWljb25zLW9sZApkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvLnByb2plY3QgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0OTM2Ny4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQxNjcxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNkdC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24sCi0gb3JnLmVjbGlwc2UuaGVscCwKLSBvcmcuZWNsaXBzZS5jZHQuZG9jLnVzZXIsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmUucGFyc2VyLnVwYztidW5kbGUtdmVyc2lvbj0iNS4wLjAiCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogLgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYW5hbHlzaXMsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHAsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnByZWZzLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy52aWV3cwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzJjNjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGh0bWwvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX01ZVEhSRUFELmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX01ZVEhSRUFELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzIyMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC9pZF9NWVRIUkVBRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPGgyPjxjb2RlPk1ZVEhSRUFEPC9jb2RlPiBrZXl3b3JkPC9oMj4KLQotCi08aDQ+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+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9pY29ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmYyZWI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wc3BicndzZS5qYmYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zL3VwYy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9pY29ucy91cGMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE4NzMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zL3VwYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjNmZGRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wbHVnaW5OYW1lPVVQQyBzdXBwb3J0IGZvciBQTERUCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwotCi12aWV3Lm5hbWU9VVBDIEFydGlmYWN0IFZpZXcKLXZpZXdjYXQubmFtZT1QVFAgVVBDIFZpZXdzCi1ydW4ubGFiZWw9UnVuIFVQQyBBbmFseXNpcwotcnVuLnRvb2x0aXA9UnVuIFVQQyBBbmFseXNpcyBvbiBzZWxlY3RlZCBmaWxlLCBmb2xkZXIsIG9yIHByb2plY3QgdG8gZmluZCBVUEMgQXJ0aWZhY3RzCi0KLSNuZWVkIHRvIGFkZCBtb3JlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZmY0NDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnByZWZzLlVQQ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5wcmVmcGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24ucHJlZnMuUExEVFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iVVBDIi8+Ci0gICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tICBVUEMgbWFya2VycyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiCi0JCWlkPSJ1cGNNYXJrZXIiCi0gICAgICAgIG5hbWU9InVwYyBBcnRpZmFjdCBNYXJrZXIiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSB0aGlzIGNoYW5nZXMgdGhlIG1hcmtlciBpbWFnZSBpbiB0aGUgZWRpdG9yIG1hcmtlciBiYXIgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudXBjTWFya2VyIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnVwY01hcmtlckFubm90YXRpb24iPgotICAgICAgPC90eXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8c3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy51cGNNYXJrZXJBbm5vdGF0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvdXBjLmdpZiIgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSIzIgotICAgICAgICAgICAgbGFiZWw9InVwYyBBbm5vdGF0aW9uIE1hcmtlciIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9InVwY0luZGljYXRpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIxMjgsMTI4LDE5MiIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotCQkJc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb25LZXk9InNob3dQb3J0aW5nSW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbiIKLSAgICAgICAgICAgIHNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Jbk92ZXJ2aWV3UnVsZXIiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0idHJ1ZSIKLSAgICAgICAgICAgIGlzR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldEtleT0iaXNQb3J0aW5nR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldCIKLQotICAgICAgICAgICAgaXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXk9ImlzUG9ydGluZ1JlY29yZEdvVG9OZXh0TmF2aWdhdGlvblRhcmdldCIKLSAgICAgICAgICAgID4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4gIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIldmlld2NhdC5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3Lm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy91cGMuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudmlld3MuVVBDQXJ0aWZhY3RWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy52aWV3cy51cGNBcnRpZmFjdFZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LnVpLkNIZWxwUHJvdmlkZXIiPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHAuVVBDQ0hlbHBJbmZvUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHAuVVBDQ0hlbHBJbmZvUHJvdmlkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYWN0aW9ucy5SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmNvbW1hbmQyIgotICAgICAgICAgICAgbmFtZT0iZmluZCB1cGMgYXJ0aWZhY3RzIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udG9vbGJhci5jb21tYW5kMSAiPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmNvbW1hbmQyIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvdXBjLmdpZiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJTaG93IFVQQyBBcnRpZmFjdHMiPgotICAgICAgICAgPC9jb21tYW5kPgotICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGY1MDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdE1hcmtpbmdWaXNpdG9yOwotCi1wdWJsaWMgY2xhc3MgVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvciBleHRlbmRzIEFydGlmYWN0TWFya2luZ1Zpc2l0b3IKLXsKLSAgICBwdWJsaWMgVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihTdHJpbmcgbWFya2VySWQpCi0gICAgewotICAgICAgICBzdXBlcihtYXJrZXJJZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENJRHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDSURzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzRlZTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENJRHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjOwotCi0vKioKLSAqIFVQQyBQbHVnaW4gY29uc3RhbnRzCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVQQ0lEcwotewotICAgIC8vIHByZWZlcmVuY2UgcGFnZSBuYW1lIGZvciBVUEMKLSAgICBTdHJpbmcgVVBDX0lOQ0xVREVTICAgID0gIlVQQyBJbmNsdWRlcyI7Ci0gICAgCi0gICAgU3RyaW5nIE1BUktFUl9JRCAgICAgICA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudXBjTWFya2VyIjsKLSAgICBTdHJpbmcgTUFSS0VSX0VSUk9SX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy51cGNFcnJvck1hcmtlciI7Ci0gICAgCi0gICAgLy8gYXJ0aWZhY3QgdmlldyBpZAotICAgIFN0cmluZyBVUENfVklFV19JRCA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudmlld3MudXBjQXJ0aWZhY3RWaWV3IjsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDUGx1Z2luLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL1VQQ1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjY3ZjA3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUENQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8qKiBUaGUgc2hhcmVkIGluc3RhbmNlLiAqLwotCXByaXZhdGUgc3RhdGljIFVQQ1BsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyI7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVUENQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUENQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiLCBwYXRoKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzZXR0aW5nIGZvciBVUEMgaW5jbHVkZSBwYXRocwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFVQQ0luY2x1ZGVEaXJzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdMaXN0ID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVVBDSURzLlVQQ19JTkNMVURFUyk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nTGlzdCwgRmlsZS5wYXRoU2VwYXJhdG9yICsgIlxuXHIiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIExpc3Q8U3RyaW5nPiBkaXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgZGlycy5hZGQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXJzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpCi0gICAgewotICAgICAgICByZXR1cm4gUExVR0lOX0lEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYWN0aW9ucy9SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYWN0aW9ucy9SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjOTM1Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2FjdGlvbnMvUnVuQW5hbHlzZVVQQ2NvbW1hbmRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS51cGMuVVBDTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUxhbmd1YWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFjdGlvbnMuUnVuQW5hbHlzZUhhbmRsZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlZpZXdBY3RpdmF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLlVQQ0FydGlmYWN0TWFya2luZ1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLlVQQ0lEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5hbmFseXNpcy5VUENDQVNUVmlzaXRvcjsKLQotLyoqCi0gKiBUaGUgIkZpbmQgVVBDIEFydGlmYWN0cyIgYWN0aW9uL2NvbW1hbmQKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFuYWx5c2VVUENjb21tYW5kSGFuZGxlciBleHRlbmRzIFJ1bkFuYWx5c2VIYW5kbGVyQmFzZQotewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgIlJ1biBBbmFseXNpcyIgYWN0aW9uCi0JICovCi0JcHVibGljIFJ1bkFuYWx5c2VVUENjb21tYW5kSGFuZGxlcigpIHsKLQkJc3VwZXIoIlVQQyIsIG5ldyBVUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKFVQQ0lEcy5NQVJLRVJfSUQpLCBVUENJRHMuTUFSS0VSX0lEKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgVVBDIGFuYWx5c2lzIGFydGlmYWN0cyBmb3IgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzCi0JICogICAgICAgICAgICBVUEMgaW5jbHVkZSBwYXRocwotCSAqIEByZXR1cm4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NhblJldHVybiBkb0FydGlmYWN0QW5hbHlzaXMoZmluYWwgSVRyYW5zbGF0aW9uVW5pdCB0dSwJZmluYWwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzKSB7Ci0JCWZpbmFsIFNjYW5SZXR1cm4gbXNyID0gbmV3IFNjYW5SZXR1cm4oKTsKLQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gdHUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJSUxhbmd1YWdlIGxhbmc7Ci0JCXRyeSB7Ci0JCQlsYW5nID0gdHUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgIAotCQkJSUFTVFRyYW5zbGF0aW9uVW5pdCBhdHUgPSB0dS5nZXRBU1QoKTsKLQkJCWlmIChsYW5nLmdldElkKCkuZXF1YWxzKFVQQ0xhbmd1YWdlLklEKSkgey8vIGNkdDQwCi0JCQkJYXR1LmFjY2VwdChuZXcgVVBDQ0FTVFZpc2l0b3IoaW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpKTsKLQkJCX0gCi0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBtc3I7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIGZpbGVuYW1lIGlzIHZhbGlkIGZvciBVUEMgYXJ0aWZhY3QgYW5hbHlzaXMKLQkgKiA8YnI+VE9ETyAgQ29uc2lkZXIgdXNpbmcgbGFuZ3VhZ2Ugb3IgY29udGVudC10eXBlIGluc3RlYWQgb2YgZmlsZSBleHRlbnNpb24/Ci0JICogUmUtdmlzaXQgYWZ0ZXIgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMSBpcyByZXNvbHZlZCAoVVBDICBjb250ZW50LXR5cGUgbm90IHJlY29nbml6ZWQpCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGlzQ1BQICBpcyB0aGUgcHJvamVjdCBhIEMrKyBwcm9qZWN0IG9yIG5vdAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZEZvckFuYWx5c2lzKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBpc0NQUCkgewotCQlpbnQgbG9jID0gZmlsZW5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJaWYgKGxvYyA8PSAwKSAvLyBpZiBubyBkb3QsIG9yIGZpbGVuYW1lIGlzICIuZm9vIiwgbm90IHZhbGlkIGZvcgotCQkJCQkJLy8gYW5hbHlzaXMuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBleHQgPSBmaWxlbmFtZS5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCWV4dCA9IGV4dC50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWlmIChleHQuZXF1YWxzKCJ1cGMiKSkgCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlUGF0aCgpIHsKLQkJcmV0dXJuIFVQQ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VVBDSW5jbHVkZURpcnMoKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVBcnRpZmFjdFZpZXcoKSB7Ci0JCVZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KFVQQ0lEcy5VUENfVklFV19JRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9hbmFseXNpcy9VUENDQVNUVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9hbmFseXNpcy9VUENDQVNUVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWU3MmI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYW5hbHlzaXMvVVBDQ0FTVFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmFuYWx5c2lzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTGl0ZXJhbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uU2NhblJldHVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYW5hbHlzaXMuUGxkdEFzdFZpc2l0b3I7Ci0KLS8qKgotICogVGhpcyBkb20td2Fsa2VyIGNvbGxlY3RzICJhcnRpZmFjdHMiIHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmljIGRvbWFpbiA8YnI+Ci0gKiAoZS5nLiBVUEMpLiBDdXJyZW50bHkgdGhlc2UgYXJ0aWZhY3RzIGluY2x1ZGUgZnVuY3Rpb24gY2FsbHMKLSAqIGFuZCBjb25zdGFudHMuIEl0IGFkZCBtYXJrZXJzIHRvIHRoZSBzb3VyY2UgZmlsZSBmb3IgQyBjb2RlLCBtYXJraW5nIHRoZQotICogcG9zaXRpb24gb2YgdGhlIGFydGlmYWN0cyBmb3VuZC4KLSAqIAotICogVGhpcyB2ZXJzaW9uIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgaW5zdGVhZCBvZiBkZWxlZ2F0aW5nIHRvPGJyPgotICogTXBpR2VuZXJhbEFTVFZpc2l0b3JCZWhhdmlvci4KLSAqCi0gKiBAYXV0aG9yIHRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVQQ0NBU1RWaXNpdG9yIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWD0idXBjXyI7Ci0KLSAgICB7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRFeHByZXNzaW9ucyA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRUcmFuc2xhdGlvblVuaXQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVUENDQVNUVmlzaXRvcihMaXN0IHVwY0luY2x1ZGVzLCBTdHJpbmcgZmlsZU5hbWUsIFNjYW5SZXR1cm4gbXNyKQotICAgIHsKLSAgICAgICAgc3VwZXIodXBjSW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpOwotCQlBUlRJRkFDVF9DQUxMID0gIlVQQyBDYWxsIjsKLQkJQVJUSUZBQ1RfQ09OU1RBTlQ9IlVQQyBDb25zdGFudCI7Ci0gICAgfQotCi0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb24pCi0gICAgICovCi0gICAgcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uKQotICAgIHsKLSAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbikgewotICAgICAgICAgICAgSUFTVEV4cHJlc3Npb24gYXN0RXhwciA9ICgoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBhc3RFeHByLmdldFJhd1NpZ25hdHVyZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZ1bmMgc2lnbmF0dXJlPSIgKyBzaWduYXR1cmUpOwotICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS5zdGFydHNXaXRoKFBSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXN0RXhwciBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSUFTVE5hbWUgZnVuY05hbWUgPSAoKElBU1RJZEV4cHJlc3Npb24pIGFzdEV4cHIpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Z1bmNOYW1lKGZ1bmNOYW1lLCBhc3RFeHByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIElBU1RMaXRlcmFsRXhwcmVzc2lvbikgewotICAgICAgICAgICAgcHJvY2Vzc01hY3JvTGl0ZXJhbCgoSUFTVExpdGVyYWxFeHByZXNzaW9uKSBleHByZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwQm9vay5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwQm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmJhOTM3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvZWRpdG9ySGVscC9VUENDSGVscEJvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5lZGl0b3JIZWxwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkNIZWxwQm9va0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5GdW5jdGlvblN1bW1hcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci0KLS8qKgotICogVVBDIGhlbHAgYm9vayAtIHRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGhvdmVyIGhlbHAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgKGFuZCBGMS9keW5hbWljIGhlbHAgYXMgd2VsbCkgcmVxdWlyZXMgYSBmaXggdG8gQ0RUIHBvc3QtNS4wLjAgcmVsZWFzZQotICogdG8gb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUubW9kZWwuVHJhbnNsYXRpb25Vbml0ICAtIHRvIHJlY29nbml6ZSBjb250ZW50LXR5cGUgb2YgVVBDIHRvIGJlIGEgZGVyaXZpYXRpdmUgKCJraW5kT2YiKSB0aGUgQyBjb250ZW50IHR5cGUuCi0gKiA8cD5TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMSAgCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUENDSGVscEJvb2sgZXh0ZW5kcyBDSGVscEJvb2tJbXBsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiVVBDIEMgSGVscCBCb29rIjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsU3RyaW5nPiBkZXNjPW5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JCi0JcHVibGljIFVQQ0NIZWxwQm9vaygpIHsKLSAgICAgICAgc3VwZXIoVVBDUGx1Z2luLmdldFBsdWdpbklkKCkpOwotICAgICAgICAvLyBwb3B1bGF0ZSBkZXNjcmlwdGlvbiBtYXAgLSB0aGlzIGp1c3QgbWFrZXMgdGhlIGZ1bmNOYW1lMkZ1bmNJbmZvIGluaXQgbGluZXMgYSBiaXQgbW9yZSB0ZXJzZQotICAgICAgCi0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWRkcmZpZWxkIiwgIlJldHVybnMgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB2YWx1ZSByZWZsZWN0aW5nIHRoZSA8cT5sb2NhbCBhZGRyZXNzPC9xPm9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci10by1zaGFyZWQgYXJndW1lbnQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWZmaW5pdHlzaXplIiwgIkEgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgbG9jYWwgcG9ydGlvbiBvZiB0aGUgZGF0YSBpbiBhIHNoYXJlZCBvYmplY3Qgd2l0aCBhZmZpbml0eSB0byA8Y29kZT50aHJlYWRpZDwvY29kZT4uIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2FsbG9jIiwgIkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxfYnJvYWRjYXN0IiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSB3aXRoIGFmZmluaXR5IHRvIGEgc2luZ2xlIHRocmVhZCB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgb24gZWFjaCB0aHJlYWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2xvY2tfYWxsb2MiLCAiRHluYW1pY2FsbHkgYWxsb2NhdGVzIGEgbG9jayBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuIFRoZSBsb2NrIGlzIGNyZWF0ZWQgaW4gYW4gdW5sb2NrZWQgc3RhdGUuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2V4Y2hhbmdlIiwgIkNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBqIHRvIHRoZSBqdGggYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBoYXMgYWZmaW5pdHkgdG8gdGhyZWFkIGkiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxfZ2F0aGVyIiwgICAgICJDb3BpZXMgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIHRoZSBpdGggYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBoYXMgYWZmaW5pdHkgdG8gYSBzaW5nbGUgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9nYXRoZXJfYWxsIiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSBmcm9tIG9uZSBzaGFyZWQgbWVtb3J5IGFyZWEgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZCB0byB0aGUgaXRoIGJsb2NrIG9mIGEgc2hhcmVkIG1lbW9yeSBhcmVhIG9uIGVhY2ggdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9sb2NrX2FsbG9jIiwgIkR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhIGxvY2sgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGl0LiBUaGUgbG9jayBpcyBjcmVhdGVkIGluIGFuIHVubG9ja2VkIHN0YXRlLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9wZXJtdXRlIiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIGEgYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBwZXJtW2ldLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9zY2F0dGVyIiwgIkNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIGFuIGFyZWEgb2Ygc2hhcmVkIG1lbW9yeSB3aXRoIGFmZmluaXR5IHRvIGEgc2luZ2xlIHRocmVhZCB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxvYyIsICJBbGxvY2F0ZXMgc2hhcmVkIHNwYWNlIG9mIGF0IGxlYXN0IG5ieXRlcyB3aXRoIGFmZmluaXR5IHRvIHRoZSBjYWxsaW5nIHRocmVhZC4iKTsgICAgICAKLSAgICAgICAgZGVzYy5wdXQoInVwY19mcmVlIiwgIkZyZWVzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzaGFyZWQgc3RvcmFnZSIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2dsb2JhbF9hbGxvYyIsIkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19nbG9iYWxfZXhpdCIsIkZsdXNoZXMgYWxsIEkvTywgcmVsZWFzZXMgYWxsIHN0b3JhZ2UsIGFuZCB0ZXJtaW5hdGVzIHRoZSBleGVjdXRpb24gZm9yIGFsbCBhY3RpdmUgdGhyZWFkcy4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19nbG9iYWxfbG9ja19hbGxvYyIsICJEeW5hbWljYWxseSBhbGxvY2F0ZXMgYSBsb2NrIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdC4gVGhlIGxvY2sgaXMgY3JlYXRlZCBpbiBhbiB1bmxvY2tlZCBzdGF0ZS4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19sb2NhbF9hbGxvYyIsIkRlcHJlY2F0ZWQuIFVzZSB1cGNfYWxsb2MgaW5zdGVhZC5cbkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UuIik7ICAgICAgCi0gICAgICAgIGRlc2MucHV0KCJ1cGNfbG9ja19hdHRlbXB0IiwgIkF0dGVtcHRzIHRvIHNldCB0aGUgc3RhdGUgb2YgYSBsb2NrIHRvIGxvY2tlZC4gUmV0dXJuIGNvZGUgaW5kaWNhdGVzIHByZXZpb3VzIHN0YXRlLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2xvY2tfZnJlZSIsICJGcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2suIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbG9ja190IiwgIlVQQyB0eXBlIGZvciBhIGxvY2siKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19sb2NrIiwgIlNldHMgdGhlIHN0YXRlIG9mIGEgbG9jayB0byBsb2NrZWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbWVtY3B5IiwgIkNvcGllcyBuIGNoYXJhY3RlcnMgZnJvbSBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggb25lIHRocmVhZCB0byBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggdGhlIHNhbWUgb3IgYW5vdGhlciB0aHJlYWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbWVtZ2V0IiwgIkNvcGllcyBuIGNoYXJhY3RlcnMgZnJvbSBhIHNoYXJlZCBvYmplY3Qgd2l0aCBhZmZpbml0eSB0byBhbnkgc2luZ2xlIHRocmVhZCB0byBhbiBvYmplY3Qgb24gdGhlIGNhbGxpbmcgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX21lbXNldCIsICJDb3BpZXMgYSB2YWx1ZSwgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIHRvIGEgc2hhcmVkIG9iamVjdCB3aXRoIGFmZmluaXR5IHRvIGFueSBzaW5nbGUgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX3BoYXNlb2YiLCAiUmV0dXJucyB0aGUgcGhhc2UgY29tcG9uZW50IG9mIHRoZSBwb2ludGVyLXRvLXNoYXJlZCBhcmd1bWVudC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19yZXNldHBoYXNlIiwgIlJldHVybnMgYSBwb2ludGVyLXRvLXNoYXJlZCB3aGljaCBpcyBpZGVudGljYWwgdG8gaXRzIGlucHV0IGV4Y2VwdCB0aGF0IGl0IGhhcyB6ZXJvIHBoYXNlIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfdGhyZWFkb2YiLCAiUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRocmVhZCB0aGF0IGhhcyBhZmZpbml0eSB0byB0aGUgc2hhcmVkIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoZSBhcmd1bWVudC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY191bmxvY2siLCAiU2V0cyB0aGUgc3RhdGUgb2YgYSBsb2NrIHRvIHVubG9ja2VkLiIpOyAKLSAgICAgICAgZGVzYy5wdXQoInNoYXJlZCIsICJ0aGlzIGlzIGEgc2hhcmVkIFVQQyBrZXl3b3JkIik7Ci0gICAgICAgIAotICAgICAgICAKLQkJLy8gcG9wdWxhdGUgZnVuYyBtYXAKLSAgICAgICAgLy9mdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19mcmVlIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoInVwY19mcmVlIiwgIiIsICJ1cGNfZnJlZSB0ZXN0IGRlc2NyaXB0aW9uIiwKLSAgICAgICAgLy8gICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJ1cGNfZnJlZSIsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSwgbnVsbCkpOwotICAgICAgICBTdHJpbmcgZGVzYyA9ICIiOyAvLyB3aWxsIGRvIG1hcCBsb29rdXAgZm9yIGRlc2NyaXB0aW9uIGluIGZwcyBtZXRob2QuCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FkZHJmaWVsZCIsIGZwcygidXBjX2FkZHJmaWVsZCIsICIiLCBkZXNjLCAic2l6ZV90IiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FmZmluaXR5c2l6ZSIsIGZwcygidXBjX2FmZmluaXR5c2l6ZSIsICIiLCBkZXNjLCAic2l6ZV90IiwgInNpemVfdCB0b3RhbHNpemUsIHNpemVfdCBuYnl0ZXMsIHNpemVfdCB0aHJlYWRpZCIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfYWxsX2FsbG9jIiwgZnBzKCJ1cGNfYWxsX2FsbG9jIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNpemVfdCBuYmxvY2tzLCBzaXplX3QgbmJ5dGVzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfYnJvYWRjYXN0IiwgZnBzKCJ1cGNfYWxsX2Jyb2FkY2FzdCIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9leGNoYW5nZSIsIGZwcygidXBjX2FsbF9leGNoYW5nZSIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9nYXRoZXJfYWxsIiwgZnBzKCJ1cGNfYWxsX2dhdGhlcl9hbGwiLCAiIiwgZGVzYywgInZvaWQiLCAic2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIHNoYXJlZCBjb25zdCB2b2lkICogcmVzdHJpY3Qgc3JjLCBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfZ2F0aGVyIiwgZnBzKCJ1cGNfYWxsX2dhdGhlciIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7ICAgICAgCQkKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfYWxsX2xvY2tfYWxsb2MiLCBmcHMoInVwY19hbGxfbG9ja19hbGxvYyIsICIiLCBkZXNjLCAidXBjX2xvY2tfdCIsICJ2b2lkIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfcGVybXV0ZSIsIGZwcygidXBjX2FsbF9wZXJtdXRlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2hhcmVkIGNvbnN0IGludCAqIHJlc3RyaWN0IHBlcm0sIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9zY2F0dGVyIiwgZnBzKCJ1cGNfYWxsX3NjYXR0ZXIiLCAiIiwgZGVzYywgInZvaWQiLCAic2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIHNoYXJlZCBjb25zdCB2b2lkICogcmVzdHJpY3Qgc3JjLCBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxvYyIsIGZwcygidXBjX2FsbG9jIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNpemVfdCBuYnl0ZXMiKSk7ICAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2ZyZWUiLCBmcHMoInVwY19mcmVlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2dsb2JhbF9hbGxvYyIsIGZwcygidXBjX2dsb2JhbF9hbGxvYyIsICIiLCBkZXNjLCAidm9pZCIsICJpbnQgc3RhdHVzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19nbG9iYWxfZXhpdCIsIGZwcygidXBjX2dsb2JhbF9leGl0IiwgIiIsIGRlc2MsICJ2b2lkIiwgImludCBzdGF0dXMiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2dsb2JhbF9sb2NrX2FsbG9jIiwgZnBzKCJ1cGNfZ2xvYmFsX2xvY2tfYWxsb2MiLCAiIiwgZGVzYywgInVwY19sb2NrX3QiLCAidm9pZCIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbG9jYWxfYWxsb2MiLCBmcHMoInVwY19sb2NhbF9hbGxvYyIsICIiLCBkZXNjLCAidm9pZCIsICJzaXplX3QgbmJsb2Nrcywgc2l6ZV90IG5ieXRlcyIpKTsgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2xvY2tfYXR0ZW1wdCIsIGZwcygidXBjX2xvY2tfYXR0ZW1wdCIsICIiLCBkZXNjLCAiaW50IiwgInVwY19sb2NrX3QgKnB0ciIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbG9ja19mcmVlIiwgZnBzKCJ1cGNfbG9ja19mcmVlIiwgIiIsIGRlc2MsICJ1cGNfbG9ja190IiwgInZvaWQiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2xvY2siLCBmcHMoInVwY19sb2NrIiwgIiIsIGRlc2MsICJ2b2lkIiwgInVwY19sb2NrX3QgKnB0ciIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbWVtY3B5IiwgZnBzKCJ1cGNfbWVtY3B5IiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG4iKSk7ICAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX21lbWdldCIsIGZwcygidXBjX21lbWdldCIsICIiLCBkZXNjLCAidm9pZCIsICJ2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG4iKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX21lbXNldCIsIGZwcygidXBjX21lbXNldCIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IG4iKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3BoYXNlb2YiLCBmcHMoInVwY19tZW1zZXQiLCAiIiwgZGVzYywgInNpemVfdCIsICJzaGFyZWQgdm9pZCAqcHRyIikpOyAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3Jlc2V0cGhhc2UiLCBmcHMoInVwY19yZXNldHBoYXNlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3RocmVhZG9mIiwgZnBzKCJ1cGNfdGhyZWFkb2YiLCAiIiwgZGVzYywgInNpemVfdCIsICJzaGFyZWQgdm9pZCAqcHRyIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY191bmxvY2siLCBmcHMoInVwY191bmxvY2siLCAiIiwgZGVzYywgInZvaWQiLCAidXBjX2xvY2tfdCAqcHRyIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInNoYXJlZCIsIGZwcygic2hhcmVkIiwgIiIsIGRlc2MsICIiLCAiIikpOwotICAgICAgICAKLSAgICAgICAgLy8gc2V0IHRpdGxlCi0gICAgICAgIHNldFRpdGxlKFRJVExFKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGlucHV0dGluZyB0aGVzZSBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnkgYW5kIEZ1bmN0aW9uU3VtbWFyeSBhcmd1bWVudHMuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gbmFtZXNwYWNlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIGlmIGVtcHR5IHdpbGwgZG8gbG9va3VwIGluIE1hcAotCSAqIEBwYXJhbSByZXR1cm5UeXBlCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElGdW5jdGlvblN1bW1hcnkgZnBzKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyByZXR1cm5UeXBlLCBTdHJpbmcgYXJncyl7Ci0JCWlmKGRlc2NyaXB0aW9uPT1udWxsIHx8IGRlc2NyaXB0aW9uLmxlbmd0aCgpPT0wKSB7Ci0JCQlkZXNjcmlwdGlvbj1nZXREZXNjKG5hbWUpOwotCQl9Ci0JCUlGdW5jdGlvblN1bW1hcnkgZnBzID0gbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwobmFtZSwgbmFtZXNwYWNlLCBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbChuYW1lLCByZXR1cm5UeXBlLCBhcmdzKSwgbnVsbCk7Ci0JCXJldHVybiBmcHM7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzYyhTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpZGVzYy5nZXQoa2V5KTsKLQkJaWYoZGVzY3JpcHRpb249PW51bGwpCi0JCQlkZXNjcmlwdGlvbj1rZXkrIiBkZXNjcmlwdGlvbiI7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMQotCSAqICgiQ0hlbHBQcm92aWRlciBub3QgY2FsbGVkIGZvciBVUEMiKQotCSAqIHNvIHRoYXQgVVBDIGhlbHAgd2lsbCBnZXQgY2FsbGVkLgotCSAqIENEVCBidWcgZml4IHJlcXVpcmVkIGZvciB0aGlzIHRvIHdvcmsgb3RoZXJ3aXNlLgotCSAqIEZvciBleGFtcGxlLCBpbiBUcmFuc2xhdGlvblVuaXQgdG8gbWFrZSB0aGUgVVBDIHR5cGUgJ2luaGVyaXQnIGZyb20gdGhlIEMgdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGlzIHJldHVybnMgYW4gaW52YWxpZCBudW1iZXIgYXMgYSB3b3JrYXJvdW5kLgotCSAqIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBwYXJ0IG9mIHRoZSBzd2l0Y2ggaW4gQ0hlbHBCb29rRGVzY3JpcHRvci5tYXRjaGVzKCkKLQkgKiB0byBleGVjdXRlIGFuZCB0aGUgVVBDIGhlbHAgd2lsbAotCSAqIG1hdGNoIGZvciBhbGwgZmlsZXMuIE5vdCBwcmV0dHkgYnV0IGl0IHdpbGwgd29yayBmb3Igbm93LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUubW9kZWwuVHJhbnNsYXRpb25Vbml0Ci0JICogCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikvLyBqdXN0IGZvciB0aGUgamF2YWRvYyBjb21tZW50IHRvIG5vdCBnZXQgd2FybmluZyA6KQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0Q0hlbHBUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwSW5mb1Byb3ZpZGVyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2VkaXRvckhlbHAvVVBDQ0hlbHBJbmZvUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2OGIzNi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2VkaXRvckhlbHAvVVBDQ0hlbHBJbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5DSGVscFByb3ZpZGVySW1wbDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBJQ0hlbHBQcm92aWRlciBhbmQgcHJvdmlkZXMgVVBDIGluZm9ybWF0aW9uIDxicj4KLSAqIChGMSwgaG92ZXIsIGNvbnRlbnQgYXNzaXN0LCBldGMuKQotICAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgIHJlcXVpcmVzIGEgZml4IHRvIENEVCBwb3N0LTUuMC4wIHJlbGVhc2UKLSAqIHRvIG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLm1vZGVsLlRyYW5zbGF0aW9uVW5pdCAgLSB0byByZWNvZ25pemUgY29udGVudC10eXBlIG9mIFVQQyB0byBiZSBhIGRlcml2aWF0aXZlICgia2luZE9mIikgdGhlIEMgY29udGVudCB0eXBlLgotICogPHA+U2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzczMzEgIAotICogPHA+RnVydGhlciBub3RlOiBhIHdvcmthcm91bmQgaGFzIGJlZW4gYXBwbGllZCBpbiBVQ0NDSGVscEJvb2sgdG8gbm90IHJlcXVpcmUgdGhlIENEVCBwYXRjaAotICogCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFVQQ0NIZWxwSW5mb1Byb3ZpZGVyIGV4dGVuZHMgQ0hlbHBQcm92aWRlckltcGwgewotCi0JcHVibGljIFVQQ0NIZWxwSW5mb1Byb3ZpZGVyKCkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVVBDQ0hlbHBJbmZvUHJvdmlkZXIgY3RvcigpLi4uIik7Ly9kZWJ1ZyBvbmx5ICwgdG8gc2VlIHdoZW4gY2FsbGVkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaGVscEJvb2sgPSBuZXcgVVBDQ0hlbHBCb29rKCk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJVUENDSGVscEluZm9Qcm92aWRlciBpbml0aWFsaXplKCkuLi4iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL3ByZWZzL1VQQ1ByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL3ByZWZzL1VQQ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDQ5YjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9wcmVmcy9VUENQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnByZWZzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QYXRoRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgYmFzZWQgb24gRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotICogCi0gKiBAYXV0aG9yIHh1ZQotICovCi0KLXB1YmxpYyBjbGFzcyBVUENQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCAgPSAiVVBDIGluY2x1ZGUgcGF0aHM6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9CUk9XU0UgPSAiUGxlYXNlIGNob29zZSBhIGRpcmVjdG9yeToiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUD0iTG9jYXRpb24gb2YgVVBDIGhlbHAgZmlsZXM6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfREVGQVVMVD0iVXNlIGRlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUF9ERUZBVUxUX0lEPSJ1cGNIZWxwVXNlRGVmYXVsdCI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfTElOVVg9IlVzZSBMaW51eCBsb2NhdGlvbjogIjsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUF9BSVg9IlVzZSBBSVggbG9jYXRpb246ICI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfT1RIRVI9Ik90aGVyOiI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfT1RIRVJfSUQ9InVwY0hlbHBPdGhlciI7Ci0gICAgCi0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0xPQ0FUSU9OX0FJWD0iL29wdC9yc2N0L2xhcGkvZWNsaXBzZS9oZWxwIjsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfTE9DQVRJT05fTElOVVg9Im9wdC9pYm1ocGMvbGFwaS9lY2xpcHNlL2hlbHAiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfV0hJQ0hfSEVMUF9JRD0iZGVmYXVsdCI7ICAvLyBhbHRlcm5hdGl2ZXMgYXJlOiBkZWZhdWx0LCBhaXgsIGxpbnV4LCBvdGhlcgotCi0gICAgcHVibGljIFVQQ1ByZWZlcmVuY2VQYWdlKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKEZMQVQpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVQQ1ByZWZlcmVuY2VQYWdlKGludCBzdHlsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHN0eWxlKTsKLSAgICAgICAgaW5pdFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBVUENQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSwgaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIGltYWdlLCBzdHlsZSk7Ci0gICAgICAgIGluaXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVBDUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHRpdGxlLCBpbnQgc3R5bGUpCi0gICAgewotICAgICAgICBzdXBlcih0aXRsZSwgc3R5bGUpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdCBwcmVmZXJlbmNlIHN0b3JlIGFuZCBzZXQgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByZWZlcmVuY2VTdG9yZSgpCi0gICAgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gVVBDUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKQotICAgIHsKLSAgICAgICAgUGF0aEVkaXRvciBwYXRoRWRpdG9yID0gbmV3IFBhdGhFZGl0b3IoVVBDSURzLlVQQ19JTkNMVURFUywgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCwKLSAgICAgICAgICAgICAgICBJTkNMVURFU19QUkVGRVJFTkNFX0JST1dTRSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKHBhdGhFZGl0b3IpOwotCi0gICAgICAgIC8vIlVzZSBkZWZhdWx0PyIKLS8vICAgICAgICBCb29sZWFuRmllbGRFZGl0b3IgYmVkID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcihVUENfSEVMUF9ERUZBVUxUX0lELFVQQ19IRUxQX0RFRkFVTFQsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0vLyAgICAgICAgYWRkRmllbGQoYmVkKTsKLSAgLyogICAgICAKLSAgICAgICAgaW50IG51bUNvbD0xOwotICAgIAlSYWRpb0dyb3VwRmllbGRFZGl0b3IgY2hvaWNlRkUgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFVQQ19XSElDSF9IRUxQX0lELCBVUENfSEVMUCwgbnVtQ29sLCBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJeyBVUENfSEVMUF9ERUZBVUxULCAiY2hvaWNlMSIgfSwgCi0JCQkJeyBVUENfSEVMUF9BSVgrVVBDX0xPQ0FUSU9OX0FJWCwgImNob2ljZTIiIH0sIAotCQkJCXsgVVBDX0hFTFBfTElOVVgrVVBDX0xPQ0FUSU9OX0xJTlVYLCAiQ2hvaWNlMyIgfSwKLQkJCQl7IFVQQ19IRUxQX09USEVSLCAiQ2hvaWNlNCIgfX0sCi0JCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgCWFkZEZpZWxkKGNob2ljZUZFKTsKLSAgICAJCi0gICAgCVN0cmluZ0ZpZWxkRWRpdG9yIG90aGVyTG9jPW5ldyBTdHJpbmdGaWVsZEVkaXRvcihVUENfSEVMUF9PVEhFUl9JRCwgVVBDX0hFTFBfT1RIRVIsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgCWFkZEZpZWxkKG90aGVyTG9jKTsKLSAgICAJKi8KLSAgICAJCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy92aWV3cy9VUENBcnRpZmFjdFZpZXcuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvdmlld3MvVVBDQXJ0aWZhY3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzI4ZDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy92aWV3cy9VUENBcnRpZmFjdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnZpZXdzLlNpbXBsZVRhYmxlTWFya2VyVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci0KLQotCi0vKioKLSAqIEEgVVBDIGFydGlmYWN0IHZpZXcgYmFzZWQgb24gU2ltcGxlVGFibGVWaWV3IDxicj4KLSAqIE5vdGUgdGhhdCB0aGUgSUQgbXVzdCBiZSB1bmlxdWUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVQQ0FydGlmYWN0VmlldyBleHRlbmRzIFNpbXBsZVRhYmxlTWFya2VyVmlldwotewotICAgIHB1YmxpYyBVUENBcnRpZmFjdFZpZXcoKQotICAgIHsKLSAgICAgICAgLy8gaWYgeW91IG5lZWQgdG8gcmVhZCBpY29uIGltYWdlcywgZXRjLiBmcm9tIHRoZSBwbHVnLWluLCBiZSBzdXJlIHRvIHBhc3MKLSAgICAgICAgLy8gaW4gYW4gYWN0dWFsIFBsdWdpbiBjbGFzcyBpbnN0YW5jZSBmb3IgZmlyc3QgYXJnCi0gICAgICAgIHN1cGVyKFVQQ1BsdWdpbi5nZXREZWZhdWx0KCksICJVUEMgQXJ0aWZhY3QiLCAiVVBDIEFydGlmYWN0cyIsICJDb25zdHJ1Y3QiLCBVUENJRHMuTUFSS0VSX0lEKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLy5jbGFzc3BhdGggYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy8ucHJvamVjdCBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmY2NzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTg0YWI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBTYW1wbGUgQ0RUIFN0YXRpYyBBbmFseXNpcwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24sCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiBJQk0gUmVzZWFyY2gKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZDNhNy4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9jYWxscy5naWYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1ZTVhNS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvY2FsbHNDLmdpZiBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvY2FsbHNDLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5ZmEyNS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzQy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzQ0YuZ2lmIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9jYWxsc0NGLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzM2IxOS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzQ0YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9jbGFzc19oaS5naWYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NsYXNzX2hpLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmOTI3ZS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NsYXNzX2hpLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvZ3JhcGhDLmdpZiBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvZ3JhcGhDLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1YzMzOC4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2dyYXBoQy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2dyYXBoVy5naWYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2dyYXBoVy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjI5NGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9ncmFwaFcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9zYW1wbGUuZ2lmIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvcGx1Z2luLnhtbCBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhNmU3NS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iU2FtcGxlIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9ImNkdEFTVDIuY29tbWFuZHMuY2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSJDYWxsR3JhcGggQ29tbWFuZCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9ImNkdEFTVDIuY29tbWFuZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0iY2R0QVNUMi5jb21tYW5kcy5jZ0NvbW1hbmQiPgotICAgICAgPC9jb21tYW5kPgotICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSJDRkcgQ29tbWFuZCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9ImNkdEFTVDIuY29tbWFuZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0iY2R0QVNUMi5jb21tYW5kcy5jZmdDb21tYW5kIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLSAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICBjb21tYW5kSWQ9ImNkdEFTVDIuY29tbWFuZHMuY2dDb21tYW5kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLmhhbmRsZXJzLkJ1aWxkQ2FsbEdyYXBoSGFuZGxlciI+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICAgICA8aGFuZGxlcgotICAgICAgICAgICAgY29tbWFuZElkPSJjZHRBU1QyLmNvbW1hbmRzLmNmZ0NvbW1hbmQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMuaGFuZGxlcnMuQnVpbGRDRkdyYXBoSGFuZGxlciI+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9ImNkdEFTVDIuY29tbWFuZHMuY2dDb21tYW5kIgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErNiIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgIDwva2V5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnVpLm1haW4ubWVudT9hZnRlcj1hZGRpdGlvbnMiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSJTYW1wbGUgTWVudSIKLSAgICAgICAgICAgICAgIG1uZW1vbmljPSJNIgotICAgICAgICAgICAgICAgaWQ9ImNkdEFTVDIubWVudXMuc2FtcGxlTWVudSI+Ci0gICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJjZHRBU1QyLmNvbW1hbmRzLmNnQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2dyYXBoVy5naWYiCi0gICAgICAgICAgICAgICAgICBpZD0iY2R0QVNUMi5tZW51cy5jZ0NvbW1hbmQiCi0gICAgICAgICAgICAgICAgICBsYWJlbD0iV2FsayBBU1QgdHJlZSIKLSAgICAgICAgICAgICAgICAgIG1uZW1vbmljPSJTIgotICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iV2FsayBBU1QgVHJlZSB0b29sdGlwIj4KLSAgICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS51aS5tYWluLnRvb2xiYXI/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgIDx0b29sYmFyCi0gICAgICAgICAgICAgICBpZD0iY2R0QVNUMi50b29sYmFycy5zYW1wbGVUb29sYmFyIj4KLSAgICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9ImNkdEFTVDIuY29tbWFuZHMuY2dDb21tYW5kIgotICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvY2FsbHNDLmdpZiIKLSAgICAgICAgICAgICAgICAgIGlkPSJjZHRBU1QyLnRvb2xiYXJzLmJ1aWxkQ2FsbEdyYXBoQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgIGxhYmVsPSJCdWlsZCBDYWxsIEdyYXBoIgotICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iQnVpbGQgQ2FsbCBHcmFwaCI+Ci0gICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0iY2R0QVNUMi5jb21tYW5kcy5jZmdDb21tYW5kIgotICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvY2FsbHNDRi5naWYiCi0gICAgICAgICAgICAgICAgICBpZD0iY2R0QVNUMi50b29sYmFycy5idWlsZENhbGxHcmFwaENvbW1hbmQiCi0gICAgICAgICAgICAgICAgICBsYWJlbD0iQnVpbGQgQ0ZHcmFwaCIKLSAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IkJ1aWxkIENvbnRyb2wgRmxvdyBHcmFwaCI+Ci0gICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICA8L3Rvb2xiYXI+Ci0gICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSJTYW1wbGUgQWN0aW9uIFNldCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0iY2R0QVNUMi5hY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IldhbGsgQVNUIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZ3JhcGhXLmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy5hY3Rpb25zLkFTVFdhbGtlckFjdGlvbiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IldhbGsgQVNUIHRvb2x0aXAiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ic2FtcGxlTWVudS9zYW1wbGVHcm91cCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJzYW1wbGVHcm91cCIKLSAgICAgICAgICAgICAgIGlkPSJjZHRhc3QyLmFjdGlvbnMuU2FtcGxlQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvSGVsbG8uYyBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy9IZWxsby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmUyODJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy9IZWxsby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBNWVZBUiA0MgotCi1pbnQgZ3JhcGh0ZXN0KHZvaWQpIHsKLQlpbnQgYSxiOwotCWludCBwaT0zLjE0OwotCWE9MDsKLQliPU1ZVkFSOyAvLyB1c2UgZGVmaW5lZAotCWIgPSBiICsgYTsKLQlhPTMuMTQ7Ci0JcmV0dXJuIGI7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy9ncmFwaC5jIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL2dyYXBoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmMyYzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL2dyYXBoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaW5jbHVkZSAibXBpLmgiCi0jaW5jbHVkZSAic3RkaW8uaCIKLSAKLXZvaWQgZm9vKGludCB4KTsKLXZvaWQgZ2VlKGludCB4KTsKLXZvaWQga2VpKGludCB4KTsKLQotdm9pZCBmb28oaW50IHgpewotICB4ICsrOwotICBnZWUoeCk7Ci19Ci0KLXZvaWQgZ2VlKGludCB4KXsKLSAgeCAqPSAzOwotICBrZWkoeCk7Ci19Ci0KLXZvaWQga2VpKGludCB4KXsKLSAgeCA9IHggJSAxMDsKLSAgZm9vKHgpOwotfQotCi12b2lkIGEoaW50IHgpewotICB4IC0tOwotfQotCi1pbnQgbWFpbjMoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0gIGludCB4ID0gMDsKLSAgZm9vKHgpOwotICBhKHgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy93YWxrYXN0LmMgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvd2Fsa2FzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRlYjg5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy93YWxrYXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLyBwMTYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBNWVZBUiA0MgotCi1pbnQgbWFpbih2b2lkKSB7Ci0JaW50IGEsYjsKLQlhPTA7Ci0JYj1NWVZBUjsgLy8gdXNlIGRlZmluZWQKLQliID0gYiArIGE7Ci0JcmV0dXJuIGI7Ci19Ci1pbnQgZm9vKGludCBiYXIpewotICBpbnQgeiA9IGJhcjsKLSAgcmV0dXJuIHo7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL3dhbGthc3RfZWRnZS5jIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL3dhbGthc3RfZWRnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE4MWI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy93YWxrYXN0X2VkZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkIGVkZ2UoaW50IGEpIHsKLQlpbnQgeCx5OwotCWlmKGE+MCkKLQkJeD0wOwotCWVsc2UgCi0JCXg9MTsKLQl5PXg7Ci19Ci1pbnQgZm9vKGludCBiYXIpewotICBpbnQgeiA9IGJhcjsKLSAgcmV0dXJuIHo7Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvd2Fsa2FzdF9lZGdlX2NvbW1lbnRzLmMgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvd2Fsa2FzdF9lZGdlX2NvbW1lbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzAwZWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL3dhbGthc3RfZWRnZV9jb21tZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLy8jaW5jbHVkZSA8c3RkaW8uaD4KLS8qKiBmdW5jdGlvbiB0aGF0IHNob3dzIGEgc2hvcnQgZWRnZSBpbiBhIENGRyAqLwotdm9pZCBlZGdlKGludCBhKSB7Ci0JaW50IHgseTsKLQlpZihhPjApCi0JCXg9MDsgIC8vIHRoZSB0aGVuIGNhc2UKLQllbHNlIAotCQl4PTE7ICAvLyB0aGUgZWxzZSBjYXNlCi0JLy8gdXNlIHJlc3VsdGFudCB2YWx1ZSBvZiB4Ci0JLyogcGFydExpbmUgY29tbWVudCAqLyB5PXg7IAotfQotLyoqIHRoZSBldmVyLXByZXNlbnQgZm9vIGZ1bmN0aW9uICovCi1pbnQgZm9vKGludCBiYXIpewotICBpbnQgeiA9IGJhcjsKLSAgcmV0dXJuIHo7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvQWN0aXZhdG9yLmphdmEgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNjBjYS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gImNkdEFTVDIiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9hY3Rpb25zL0FTVFdhbGtlckFjdGlvbi5qYXZhIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvYWN0aW9ucy9BU1RXYWxrZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzMjNiYy4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9hY3Rpb25zL0FTVFdhbGtlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RCaW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQ29tcG91bmRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvckluY2x1ZGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQuSURlcGVuZGVuY3lUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFRyYW5zbGF0aW9uVW5pdC5JRGVwZW5kZW5jeVRyZWUuSUFTVEluY2x1c2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklDRWxlbWVudFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSVRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVEV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBUaGlzIHdhcyBpbml0aWFsbHkgYnVpbHQgZnJvbSB0aGUgIlNhbXBsZSBBY3Rpb24iIHBsdWdpbiBleGFtcGxlLgotICogCi0gKiBUaGlzIHNhbXBsZSBhY3Rpb24gd2Fsa3MgYW4gQVNUIHRyZWUgZm9yIGEgc2VsZWN0ZWQgQyBzb3VyY2UgZmlsZS4KLSAqIFNlbGVjdCBhIEMgc291cmNlIGZpbGUgaW4gdGhlIFByb2plY3RzIHZpZXcgYW5kIGNsaWNrIHRoZSBpY29uIGluIHRoZSB0b29sYmFyCi0gKiB0byBwcmludCBBU1Qgd2Fsa2luZyBpbmZvcm1hdGlvbi4KLSAqIAotICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzIHRpYmJpdHRzQHVzLmlibS5jb20KLSAqLwotcHVibGljIGNsYXNzIEFTVFdhbGtlckFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQVNUV2Fsa2VyQWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBhY3Rpb24gaGFzIGJlZW4gYWN0aXZhdGVkLiBUaGUgYXJndW1lbnQgb2YgdGhlIG1ldGhvZCByZXByZXNlbnRzIHRoZQotCSAqICdyZWFsJyBhY3Rpb24gc2l0dGluZyBpbiB0aGUgd29ya2JlbmNoIFVJLgotCSAqIAotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI3J1bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbih3aW5kb3cuZ2V0U2hlbGwoKSwgIkNkdEFTVDIgUGx1Zy1pbiIsCi0JCQkJIlNlZSBDb25zb2xlIGZvciBBU1Qgd2Fsa2luZyByZXN1bHRzIik7Ci0JCXRyeSB7Ci0JCQlydW5TZWxlY3Rpb25FeGFtcGxlKHNlbGVjdGlvbik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBiZWVuIGNoYW5nZWQuIFdlIGNhbiBjaGFuZ2UgdGhlIHN0YXRlIG9mCi0JICogdGhlICdyZWFsJyBhY3Rpb24gaGVyZSBpZiB3ZSB3YW50LCBidXQgdGhpcyBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgdGhlCi0JICogZGVsZWdhdGUgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5TZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb249IiArIHNlbGVjdGlvbik7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJhbnNsYXRpb25Vbml0KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIElUcmFuc2xhdGlvblVuaXQiKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUNFbGVtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklDRWxlbWVudCIpOwotCQkJd2Fsa0lDRWxlbWVudCgoSUNFbGVtZW50KSBzZWxlY3Rpb24pOwotCi0JCX0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgSVN0cnVjdHVyZWRTZWxlY3Rpb24sIGNvbnRlbnRzOiIpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gSXQgY2FuIGJlIGEgUHJvamVjdCwgRm9sZGVyLCBGaWxlLCBldGMuLi4KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCQlJQWRhcHRhYmxlIGlhZCA9IChJQWRhcHRhYmxlKSBvYmo7Ci0JCQkJCWZpbmFsIElSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBpYWQKLQkJCQkJCQkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IHJlc291cmNlOiAiICsgcmVzKTsKLQotCQkJCQkvLyBJQ0VsZW1lbnQgY292ZXJzIGZvbGRlcnMgYW5kIHRyYW5zbGF0aW9udW5pdHMKLQkJCQkJZmluYWwgSUNFbGVtZW50IGNlID0gKElDRWxlbWVudCkgaWFkCi0JCQkJCQkJLmdldEFkYXB0ZXIoSUNFbGVtZW50LmNsYXNzKTsvLyBjZHQ0MAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElDRWxlbWVudDogIiArIGNlKTsKLQotCQkJCQlJVHJhbnNsYXRpb25Vbml0IHR1ID0gKElUcmFuc2xhdGlvblVuaXQpIGlhZAotCQkJCQkJCS5nZXRBZGFwdGVyKElUcmFuc2xhdGlvblVuaXQuY2xhc3MpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElUcmFuc2xhdGlvblVuaXQ6ICIgKyB0dSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaXN0RmxhdEluZm8odHUpOwotCQkJCQkJd2Fsa0lUVSh0dSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0vLyBlbmQgZm9yCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5TZWxlY3Rpb25FeGFtcGxlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBJdCBjYW4gYmUgYSBQcm9qZWN0LCBGb2xkZXIsIEZpbGUsIGV0Yy4uLgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJCUlBZGFwdGFibGUgaWFkID0gKElBZGFwdGFibGUpIG9iajsKLQkJCQkJZmluYWwgSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIGlhZAotCQkJCQkJCS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICBnb3QgcmVzb3VyY2U6ICIgKyByZXMpOwotCi0JCQkJCS8vIElDRWxlbWVudCBjb3ZlcnMgZm9sZGVycyBhbmQgdHJhbnNsYXRpb24gdW5pdHMKLQkJCQkJZmluYWwgSUNFbGVtZW50IGNlID0gKElDRWxlbWVudCkgaWFkCi0JCQkJCQkJLmdldEFkYXB0ZXIoSUNFbGVtZW50LmNsYXNzKTsvLyBjZHQ0MAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElDRWxlbWVudDogIiArIGNlKTsKLQotCQkJCQlJVHJhbnNsYXRpb25Vbml0IHR1ID0gKElUcmFuc2xhdGlvblVuaXQpIGlhZAotCQkJCQkJCS5nZXRBZGFwdGVyKElUcmFuc2xhdGlvblVuaXQuY2xhc3MpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElUcmFuc2xhdGlvblVuaXQ6ICIgKyB0dSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09PT09PT09bGlzdEZsYXRJbmZvKCk6Iik7Ci0JCQkJCWxpc3RGbGF0SW5mbyh0dSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09PT09PT09d2Fsa0lUVSgpOiIpOwotCQkJCQl3YWxrSVRVKHR1KTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbj09PT09PT09PT13YWxrSVRVX0FTVCgpOiIpOwotCQkJCQl3YWxrSVRVX0FTVCh0dSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGRpc3Bvc2Ugb2YgYW55IHN5c3RlbSByZXNvdXJjZXMgd2UgcHJldmlvdXNseQotCSAqIGFsbG9jYXRlZC4KLQkgKiAKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBXZSB3aWxsIGNhY2hlIHdpbmRvdyBvYmplY3QgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBwcm92aWRlIHBhcmVudCBzaGVsbAotCSAqIGZvciB0aGUgbWVzc2FnZSBkaWFsb2cuCi0JICogCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JcHVibGljIHZvaWQgd2Fsa0lDRWxlbWVudChJQ0VsZW1lbnQgaWNlKSB7Ci0JCS8vIElDRWxlbWVudCBpY2UgPSAoSUNFbGVtZW50KXNlbGVjdGlvbjsKLQkJU3RyaW5nIGVOYW1lID0gaWNlLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSUNFbGVtZW50IG5hbWU6ICIgKyBlTmFtZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBXYWxrIHRoZSBJVHJhbnNsYXRpb25Vbml0IHdpdGggYSB2aXNpdG9yLCB3aGljaCAob25seSkgdmlzaXRzIElDRWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gdHUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgd2Fsa0lUVShJVHJhbnNsYXRpb25Vbml0IHR1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0dU5hbWUgPSB0dS5nZXRFbGVtZW50TmFtZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIklUcmFuc2xhdGlvblVuaXQgbmFtZTogIiArIHR1TmFtZSk7Ci0JCXR1LmFjY2VwdChuZXcgSUNFbGVtZW50VmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElDRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nOiAiICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCQlyZXR1cm4gdmlzaXRDaGlsZHJlbjsKLQkJCX0KLQkJfSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVNUIHZpc2l0b3IgZm9yICIgKyB0dU5hbWUpOwotCQlJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCA9IHR1LmdldEFTVCgpOwotCQlhc3QuYWNjZXB0KG5ldyBNeUFTVFZpc2l0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogV2FsayB0aGUgSUFTVFRyYW5zbGF0aW9uVW5pdCdzIEFTVCB0cmVlLCB3aGljaCBjYW4gdmlzaXQgbWFueSB0eXBlcyBvZgotCSAqIG5vZGVzCi0JICogCi0JICogQHBhcmFtIHR1Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhbGtJVFVfQVNUKElUcmFuc2xhdGlvblVuaXQgdHUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJBU1QgdmlzaXRvciBmb3IgIiArIHR1LmdldEVsZW1lbnROYW1lKCkpOwotCQlJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCA9IHR1LmdldEFTVCgpOwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIlxuPT09PT09PT09PT09PT09PT1NeUFTVFZpc2l0b3IyIGFsc28gaW1wbGVtZW50cyBsZWF2ZSgpIFxuIik7Ci0JCWFzdC5hY2NlcHQobmV3IE15QVNUVmlzaXRvcjIoKSk7Ci0JfQotCi0JY2xhc3MgTXlBU1RWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0KLQkJTXlBU1RWaXNpdG9yKCkgewotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOyAvLyBsb3RzIG1vcmUKLQkJCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGludCB2aXNpdChJQVNUU3RhdGVtZW50IHN0bXQpIHsgLy8gbG90cyBtb3JlCi0JCQlTdHJpbmcgc2lnID0gc3RtdC5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCWlmIChzaWcubGVuZ3RoKCkgPiAwKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgc3RtdDogIiArIHN0bXQuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJZWxzZSBpZiAoc3RtdCBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCkgewotCQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBjc3RtdCA9IChJQVNUQ29tcG91bmRTdGF0ZW1lbnQpIHN0bXQ7Ci0JCQkJSUFTVFN0YXRlbWVudFtdIHN0bXRzID0gY3N0bXQuZ2V0U3RhdGVtZW50cygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgY29tcG91bmQgc3RtdCB3aXRoIHN0bXRzOiAiCi0JCQkJCQkrIHN0bXRzLmxlbmd0aCk7Ci0JCQkJZm9yIChJQVNUU3RhdGVtZW50IHN0IDogc3RtdHMpIHsKLQkJCQkJU3RyaW5nIHJhd1NpZyA9IHN0LmdldFJhd1NpZ25hdHVyZSgpOwotCi0JCQkJCWlmIChyYXdTaWcubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAtPiIgKyBzdCk7Ci0JCQkJCQlpZiAoc3QgaW5zdGFuY2VvZiBDQVNURXhwcmVzc2lvblN0YXRlbWVudCkgewotCQkJCQkJCUNBU1RFeHByZXNzaW9uU3RhdGVtZW50IGVzID0gKENBU1RFeHByZXNzaW9uU3RhdGVtZW50KSBzdDsKLQkJCQkJCQlJQVNURXhwcmVzc2lvbiBleHAgPSBlcy5nZXRFeHByZXNzaW9uKCk7Ci0JCQkJCQkJaWYgKGV4cCBpbnN0YW5jZW9mIElBU1RCaW5hcnlFeHByZXNzaW9uKSB7Ci0JCQkJCQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIGJleHAgPSAoSUFTVEJpbmFyeUV4cHJlc3Npb24pIGV4cDsKLQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBiaW5hcnkgZXhwOiAiCi0JCQkJCQkJCQkJKyBiZXhwLmdldE9wZXJhbmQxKCkgKyAiICIKLQkJCQkJCQkJCQkrIGJleHAuZ2V0T3BlcmF0b3IoKSArICIgIgotCQkJCQkJCQkJCSsgYmV4cC5nZXRPcGVyYW5kMigpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIGV4cFN0ciA9IGV4cC5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQkJCQlJVHlwZSB0eXBlID0gZXhwLmdldEV4cHJlc3Npb25UeXBlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC0+IiArIHJhd1NpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgZGVjbDogIiArIGRlY2wuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCX0KLQotCi0JLyoqIFZpc2l0b3IgdGhhdCB1c2VzIGxlYXZlKCkgdG8gc2hvdyBuZXN0aW5nICovCi0JY2xhc3MgTXlBU1RWaXNpdG9yMiBleHRlbmRzIEFTVFZpc2l0b3IgewotCi0JCU15QVNUVmlzaXRvcjIoKSB7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXROYW1lcyA9IHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogUHJpbnQgc3RhdGVtZW50IGluZm86IGlmIGFsdGVyZWQgYnkgcHJlcHJvY2Vzc29yLCB0aGVuCi0JCSAqIGdldFJhd1NpZ25hdHVyZSgpIGlzIGVtcHR5OyB1c2UgYWx0ZXJuYXRlIHJlcHJlc2VudGF0aW9uCi0JCSAqLwotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RTdGF0ZW1lbnQgc3RtdCkgewotCQkJU3RyaW5nIHNpZyA9IHN0bXQuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQlpZiAoc2lnLmxlbmd0aCgpID4gMCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nIHN0bXQ6ICIgKyBzdG10LmdldFJhd1NpZ25hdHVyZSgpKTsKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nIHN0bXQ6ICIgKyBzdG10LnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1REZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nIGRlY2w6ICIgKyBkZWNsLmdldFJhd1NpZ25hdHVyZSgpKTsKLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0KLQkJcHVibGljIGludCB2aXNpdChJQVNUTmFtZSBuYW1lKSB7Ci0JCQlTdHJpbmcgcHJ0TmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKLQkJCWlmIChwcnROYW1lLmxlbmd0aCgpID09IDApCi0JCQkJcHJ0TmFtZSA9IG5hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7IC8vIHVzZSBwcmUgcHJlLXByb2Nlc3NvcgotCQkJLy8gdmFsdWUKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgbmFtZTogIiArIHBydE5hbWUpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGxlYXZlKElBU1RTdGF0ZW1lbnQgc3RtdCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgTGVhdmluZyBzdG10OiAiICsgc3RtdC5nZXRSYXdTaWduYXR1cmUoKSk7Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbGVhdmUoSUFTVERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIExlYXZpbmcgZGVjbDogIiArIGRlY2wuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGxlYXZlKElBU1ROYW1lIG5hbWUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIExlYXZpbmcgbmFtZTogIiArIG5hbWUpOy8vIHBvc3NpYmx5IGVtcHR5Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3QgImZsYXQgaW5mbyIgdHlwZSBxdWVyaWVzIHRoYXQgcmV0dXJuIGxpc3RzIG9mIHRoaW5ncyBvbiB0aGUgYXN0Ci0JICogCi0JICogQHBhcmFtIHR1Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jdm9pZCBsaXN0RmxhdEluZm8oSVRyYW5zbGF0aW9uVW5pdCB0dSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCA9IHR1LmdldEFTVCgpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVNUIGZvcjogIiArIGFzdC5nZXRDb250YWluaW5nRmlsZW5hbWUoKSk7Ci0KLQkJSUFTVFByZXByb2Nlc3NvclN0YXRlbWVudFtdIHBwc3MgPSBhc3QuZ2V0QWxsUHJlcHJvY2Vzc29yU3RhdGVtZW50cygpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXByb2Nlc3NvclN0bXRzOiAob21pdCAvdXNyLy4uLikiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcHNzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQVNUUHJlcHJvY2Vzc29yU3RhdGVtZW50IHBwcyA9IHBwc3NbaV07Ci0JCQlTdHJpbmcgZm4gPSBwcHMuZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCk7Ci0JCQlpZiAoIWZuLnN0YXJ0c1dpdGgoIi91c3IiKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIiAgUHJlcHJvY2Vzc29yU3RtdDogIiArIGxhc3RwYXJ0KGZuKQotCQkJCQkJKyAiICIgKyBwcHMuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJfQotCQl9Ci0JCUlBU1REZWNsYXJhdGlvbltdIGRlY2xzID0gYXN0LmdldERlY2xhcmF0aW9ucygpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlY2xhcmF0aW9uczogKG9taXQgL3Vzci8uLi4pIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVjbHMubGVuZ3RoOyBpKyspIHsKLQkJCUlBU1REZWNsYXJhdGlvbiBkZWNsID0gZGVjbHNbaV07Ci0JCQlTdHJpbmcgZm4gPSBkZWNsLmdldENvbnRhaW5pbmdGaWxlbmFtZSgpOwotCQkJaWYgKCFmbi5zdGFydHNXaXRoKCIvdXNyIikpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaSArICIgIERlY2xhcmF0aW9uOiAiICsgbGFzdHBhcnQoZm4pICsgIiAiCi0JCQkJCQkrIGRlY2wuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJfQotCQl9Ci0JCUlBU1RQcmVwcm9jZXNzb3JTdGF0ZW1lbnRbXSBpZGlycyA9IGFzdC5nZXRJbmNsdWRlRGlyZWN0aXZlcygpOwotCQkvLyByZWN1cnNlcyB0aHJ1IGluY2x1ZGVzIGluY2x1ZGVkIGJ5IG90aGVyIGluY2x1ZGVzLi4uCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW5jbHVkZSBkaXJlY3RpdmVzOiAiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGlycy5sZW5ndGg7IGkrKykgewotCQkJSUFTVFByZXByb2Nlc3NvclN0YXRlbWVudCBpZGlyID0gaWRpcnNbaV07Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oaSArICIgaW5jbHVkZSBkaXJlY3RpdmU6ICIgKyBpZGlyKTsKLQotCQl9Ci0KLQkJSURlcGVuZGVuY3lUcmVlIGR0ID0gYXN0LmdldERlcGVuZGVuY3lUcmVlKCk7Ci0JCUlBU1RJbmNsdXNpb25Ob2RlW10gaW5zID0gZHQuZ2V0SW5jbHVzaW9ucygpOwotCQkvLyB0aGlzIGxpc3RzIG9ubHkgdGhlIGluY2x1ZGVzIGltbWVkaWF0ZWx5IGluY2x1ZGVkIGJ5IHRoaXMgc3JjIGZpbGUKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXBlbmRlbmN5IHRyZWUvSW5jbHVkZSBzdGF0ZW1lbnRzOiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlucy5sZW5ndGg7IGkrKykgewotCQkJSUFTVEluY2x1c2lvbk5vZGUgaW4gPSBpbnNbaV07Ci0JCQlJQVNUUHJlcHJvY2Vzc29ySW5jbHVkZVN0YXRlbWVudCBpcyA9IGluLmdldEluY2x1ZGVEaXJlY3RpdmUoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIiAgaW5jbHVkZSBzdG10OiAiICsgaXMpOwotCQl9Ci0JCS8vIG5vdGU6IGNvbW1lbnRzIGFyZSBub3QgYXZhaWxhYmxlIGFzIEFTVCBOb2RlcyBidXQgYXJlIGF2YWlsYWJsZSBoZXJlLgotCQkvLyAoSW4gc3BpdGUgb2YgdGhlIGV4aXN0ZW5jZSBvZiBJQVNUQ29tbWVudCBjbGFzcyBhbmQgdmlzaXQoSUFTVENvbW1lbnQpIG1ldGhvZC4pCi0JCS8vIFRoZXNlIGFyZSBkZXByZWNhdGVkIGluIENEVCA1LjAKLQkJYXN0ID0gdHUuZ2V0QVNUKG51bGwsSVRyYW5zbGF0aW9uVW5pdC5BU1RfQ1JFQVRFX0NPTU1FTlRfTk9ERVMpOwotCQlJQVNUQ29tbWVudFtdIGNtdHMgPSBhc3QuZ2V0Q29tbWVudHMoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21tZW50cyBmb3VuZDogIitjbXRzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY210cy5sZW5ndGg7IGkrKykgewotCQkJSUFTVENvbW1lbnQgY29tbWVudCA9IGNtdHNbaV07Ci0JCQljaGFyW10gY210Q2hhcj1jb21tZW50LmdldENvbW1lbnQoKTsKLQkJCVN0cmluZyBjbXRTdHI9U3RyaW5nLnZhbHVlT2YoY210Q2hhcik7Ci0JCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIiBDb21tZW50OiBbIiArIGNtdFN0ciArICJdIHJhd1NpZzogWyIrY29tbWVudC5nZXRSYXdTaWduYXR1cmUoKSsiXSBsaW5lICIKLQkJCQkJKyBjb21tZW50LmdldEZpbGVMb2NhdGlvbigpKTsKLQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbGFzdCBwYXJ0IG9mIHN0cmluZyBwYXRobmFtZTogZS5nLiBhL2IvYy9mb28uYyByZXR1cm5zIGZvby5jCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBsYXN0cGFydChTdHJpbmcgcGF0aG5hbWUpIHsKLQkJaW50IGxvYyA9IHBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JCXJldHVybiBwYXRobmFtZS5zdWJzdHJpbmcobG9jICsgMSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ0ZHcmFwaEhhbmRsZXIuamF2YSBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ0ZHcmFwaEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0YWQ4ZS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9oYW5kbGVycy9CdWlsZENGR3JhcGhIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuR3JhcGhDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDb250cm9sRmxvd0dyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGwuQ29udHJvbEZsb3dHcmFwaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotLyoqCi0gKiBCdWlsZCBDb250cm9sIEZsb3cgR3JhcGgKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzICB0aWJiaXR0c0B1cy5pYm0uY29tCi0gKiAgCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuR3JhcGhDcmVhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZENGR3JhcGhIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSUNhbGxHcmFwaCBjYWxsR3JhcGg7Ci0JcHJvdGVjdGVkIEdyYXBoQ3JlYXRvciBncmFwaENyZWF0b3I7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBCdWlsZENGR3JhcGhIYW5kbGVyKCkgewotCQlncmFwaENyZWF0b3IgPSBuZXcgR3JhcGhDcmVhdG9yKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kOiBleHRyYWN0IGV4dHJhY3QgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNvbnRleHQuIDxicj4KLQkgKiBBIG5ldyBjYWxsIGdyYXBoIGlzIGNvbnN0cnVjdGVkIGZvciB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBieSBJSGFuZGxlcgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBtdXN0IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdpbmRvdyA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXZlbnQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkQ0ZHcmFwaEhhbmRsZXIuZXhlY3V0ZSgpIik7Ci0JCS8vIGNyZWF0ZSBhbiBlbXB0eSBjYWxsIGdyYXBoIHRvIGJlZ2luIHdpdGgKLQkJY2FsbEdyYXBoID0gZ3JhcGhDcmVhdG9yLmluaXRDYWxsR3JhcGgoKTsKLQkJLy8gR2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihldmVudCk7Ci0JCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCW1lc3NhZ2UoIk5vIHNlbGVjdGlvbiBkZXRlY3RlZC4gUGxlYXNlIHNlbGVjdCBhIGZpbGUsIGZvbGRlciwgb3IgcHJvamVjdCBpbiB0aGUgUHJvamVjdHMgVmlldy4iKTsKLQkJCQlzZWxlY3Rpb249bnVsbDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIFdlIGl0ZXJhdGUgaGVyZSBvbmx5IHRvIGhhbmRsZSB0aGUgcG9zc2liaWxpdHkgb2YgbXVsdGlwbGUtc2VsZWN0aW9uLgotCQkvLyBncmFwaENyZWF0b3Igd2lsbCBkZXNjZW5kIGludG8gY2hpbGQgbm9kZXMuCi0JCS8qZmluYWwqLyBJUmVzb3VyY2UgcmVzPW51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCS8vIEl0IGNhbiBiZSBhIFByb2plY3QsIEZvbGRlciwgRmlsZSwgZXRjLi4uCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCUlBZGFwdGFibGUgaWFkID0gKElBZGFwdGFibGUpIG9iajsKLQkJCQlyZXMgPSAoSVJlc291cmNlKSBpYWQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCS8vIE5vdGU6IHB1dCB0aGlzIGluIGEgSm9iIG9yIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBpZiByZXNvdXJjZXMKLQkJCQkvLyB3aWxsIGJlIGNoYW5nZWQuCi0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCWNhbGxHcmFwaCA9IGdyYXBoQ3JlYXRvci5pbml0Q2FsbEdyYXBoKHJlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVzc2FnZSgiUGxlYXNlIHNlbGVjdCBhIGZpbGUsIGZvbGRlciwgb3IgcHJvamVjdCBpbiB0aGUgUHJvamVjdHMgdmlldyIpOwotCQkJCQlzZWxlY3Rpb249bnVsbDsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZ3JhcGhDcmVhdG9yLmNvbXB1dGVDYWxsR3JhcGgoY2FsbEdyYXBoKTsKLQkJLy8gZ2V0IHRoZSBmaXJzdCBub2RlCi0JCUlDYWxsR3JhcGhOb2RlIHRvcE5vZGUgPSBjYWxsR3JhcGgudG9wRW50cnkoKTsKLQkJU3RyaW5nIHRvcE5hbWU9dG9wTm9kZS5nZXRGdW5jTmFtZSgpOwotCQkKLQkJSUNhbGxHcmFwaE5vZGUgZmlyc3ROb2RlPWNhbGxHcmFwaC5nZXRBbGxOb2RlcygpLmdldCgwKTsKLQkJU3RyaW5nIGZpcnN0TmFtZT1maXJzdE5vZGUuZ2V0RnVuY05hbWUoKTsKLQkJLy8gZ2V0IGEgbm9kZSBieSBmdW5jdGlvbiBuYW1lCi0JCUlDYWxsR3JhcGhOb2RlIG5hbWVkTm9kZSA9IGNhbGxHcmFwaC5nZXROb2RlKHJlcy5nZXROYW1lKCksICJmb28iKTsKLQkJU3RyaW5nIG5hbWVkTmFtZT0iIjsKLQkJaWYobmFtZWROb2RlIT1udWxsKSB7Ci0JCQluYW1lZE5hbWU9bmFtZWROb2RlLmdldEZ1bmNOYW1lKCk7Ci0JCX0KLQkJCi0JCUlDYWxsR3JhcGhOb2RlIG5vZGUgPSB0b3BOb2RlOwotCQlJQVNUU3RhdGVtZW50IGZ1bmNCb2R5PW5vZGUuZ2V0RnVuY0RlZigpLmdldEJvZHkoKTsKLQkJSUNvbnRyb2xGbG93R3JhcGggY2ZnID0gbmV3IENvbnRyb2xGbG93R3JhcGgoZnVuY0JvZHkpOwotCQljZmcuYnVpbGRDRkcoKTsKLQkJCi0JCUlCbG9jayBlbnRyeUJsb2NrID0gY2ZnLmdldEVudHJ5KCk7Ci0JCWZvciAoSUJsb2NrIGJsb2NrPSBjZmcuZ2V0RW50cnkoKTsgYmxvY2shPW51bGw7IGJsb2NrID0gYmxvY2suZ2V0VG9wTmV4dCgpKSB7Ci0JCQlibG9jay5wcmludCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZENhbGxHcmFwaEhhbmRsZXIgZ290IHNlbGVjdGlvbiIpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24od2luZG93LmdldFNoZWxsKCksCi0JCQkJIkhvdXN0b24sIHdlIGhhdmUgYSBwcm9ibGVtIiwgbXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9oYW5kbGVycy9CdWlsZENhbGxHcmFwaEhhbmRsZXIuamF2YSBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ2FsbEdyYXBoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWM2ODYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ2FsbEdyYXBoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuR3JhcGhDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLS8qKgotICogVGhpcyBoYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyLCBhbiBJSGFuZGxlciBiYXNlIGNsYXNzLiBUaGlzIGhhbmRsZXIKLSAqIGJ1aWxkcyBhIGNhbGwgZ3JhcGggZm9yIHRoZSBzZWxlY3RlZCByZXNvdXJjZShzKSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LiA8YnI+Ci0gKiAKLSAqIFR3byBzdGVwcyB0byBidWlsZGluZyBjYWxsIGdyYXBoOiA8YnI+Ci0gKiAxLiBjb2xsZWN0IGFsbCBmdW5jdGlvbiBkZWZpbml0aW9ucyBpbiB0aGUgY2FsbCBncmFwaCA8YnI+Ci0gKiAyLiBjb25zdHJ1Y3QgdGhlIGNhbGxlciBhbmQgY2FsbGVlIHJlbGF0aW9uc2hpcCBhbW9uZyB0aGUgQ2FsbEdyYXBoTm9kZXMKLSAqIDxicj5Nb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgYnkgR3JhcGhDcmVhdG9yCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cyB0aWJiaXR0c0B1cy5pYm0uY29tCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcgotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcgotICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5HcmFwaENyZWF0b3IKLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkQ2FsbEdyYXBoSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJvdGVjdGVkIElDYWxsR3JhcGggY2FsbEdyYXBoOwotCXByb3RlY3RlZCBHcmFwaENyZWF0b3IgZ3JhcGhDcmVhdG9yOwotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQnVpbGRDYWxsR3JhcGhIYW5kbGVyKCkgewotCQlncmFwaENyZWF0b3IgPSBuZXcgR3JhcGhDcmVhdG9yKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kOiBleHRyYWN0IGV4dHJhY3QgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNvbnRleHQuIDxicj4KLQkgKiBBIG5ldyBjYWxsIGdyYXBoIGlzIGNvbnN0cnVjdGVkIGZvciB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBieSBJSGFuZGxlcgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBtdXN0IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdpbmRvdyA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXZlbnQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkQ2FsbEdyYXBoSGFuZGxlci5leGVjdXRlKCkiKTsKLQkJLy8gY3JlYXRlIGFuIGVtcHR5IGNhbGwgZ3JhcGggdG8gYmVnaW4gd2l0aAotCQljYWxsR3JhcGggPSBncmFwaENyZWF0b3IuaW5pdENhbGxHcmFwaCgpOwotCQkvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJSVNlbGVjdGlvbiBzZWwgPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKGV2ZW50KTsKLQkJCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQkJfQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJbWVzc2FnZSgiTm8gc2VsZWN0aW9uIGRldGVjdGVkLiBQbGVhc2Ugc2VsZWN0IGEgZmlsZSwgZm9sZGVyLCBvciBwcm9qZWN0IGluIHRoZSBQcm9qZWN0cyBWaWV3LiIpOwotCQkJCXNlbGVjdGlvbj1udWxsOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gV2UgaXRlcmF0ZSBoZXJlIG9ubHkgdG8gaGFuZGxlIHRoZSBwb3NzaWJpbGl0eSBvZiBtdWx0aXBsZS1zZWxlY3Rpb24uCi0JCS8vIGdyYXBoQ3JlYXRvciB3aWxsIGRlc2NlbmQgaW50byBjaGlsZCBub2Rlcy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJLy8gSXQgY2FuIGJlIGEgUHJvamVjdCwgRm9sZGVyLCBGaWxlLCBldGMuLi4KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJSUFkYXB0YWJsZSBpYWQgPSAoSUFkYXB0YWJsZSkgb2JqOwotCQkJCWZpbmFsIElSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBpYWQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCS8vIE5vdGU6IHB1dCB0aGlzIGluIGEgSm9iIG9yIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBpZiByZXNvdXJjZXMKLQkJCQkvLyB3aWxsIGJlIGNoYW5nZWQuCi0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCWNhbGxHcmFwaCA9IGdyYXBoQ3JlYXRvci5pbml0Q2FsbEdyYXBoKHJlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVzc2FnZSgiUGxlYXNlIHNlbGVjdCBhIGZpbGUsIGZvbGRlciwgb3IgcHJvamVjdCBpbiB0aGUgUHJvamVjdHMgdmlldyIpOwotCQkJCQlzZWxlY3Rpb249bnVsbDsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb3VyY2VzIHNjYW5uZWQuIE5vdyBzZWFyY2ggZm9yIGNhbGxlcnMvY2FsbGVlcyIpOwotCQlncmFwaENyZWF0b3IuY29tcHV0ZUNhbGxHcmFwaChjYWxsR3JhcGgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oInNob3dDYWxsR3JhcGguLi4iKTsKLQkJZ3JhcGhDcmVhdG9yLnNob3dDYWxsR3JhcGgoY2FsbEdyYXBoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJzaG93Q2FsbEdyYXBoIGNvbXBsZXRlLiIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJdGhpcy5zZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGRDYWxsR3JhcGhIYW5kbGVyIGdvdCBzZWxlY3Rpb24iKTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgbWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHdpbmRvdy5nZXRTaGVsbCgpLAotCQkJCSJIb3VzdG9uLCB3ZSBoYXZlIGEgcHJvYmxlbSIsIG1zZyk7Ci0JfQotfQo=